Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF单向绑定只工作一次_C#_Wpf_Data Binding - Fatal编程技术网

C# WPF单向绑定只工作一次

C# WPF单向绑定只工作一次,c#,wpf,data-binding,C#,Wpf,Data Binding,我有一个有两个组合框的视图。一个是用户选择布管类型名称的位置,另一个是应为所选管道类型提供可用直径列表的位置 每当用户选择管道类型时,另一个组合框应更新可用直径的列表 AvailableDiameters和RoutingPipeTypeName属性在实现INotifyPropertyChanged接口的上下文类中是静态的。在xaml中,我设置了这些属性的绑定,在代码隐藏中也设置了DataContext 问题是当视图初始化时,直径列表只更新一次 调试时,我可以看到,当管道类型名称上的选择发生更改时

我有一个有两个组合框的视图。一个是用户选择布管类型名称的位置,另一个是应为所选管道类型提供可用直径列表的位置

每当用户选择管道类型时,另一个组合框应更新可用直径的列表

AvailableDiameters和RoutingPipeTypeName属性在实现INotifyPropertyChanged接口的上下文类中是静态的。在xaml中,我设置了这些属性的绑定,在代码隐藏中也设置了DataContext

问题是当视图初始化时,直径列表只更新一次

调试时,我可以看到,当管道类型名称上的选择发生更改时,属性备份字段的值会正确更新,只有在UI中,可用直径列表不会更新

上下文类:

公共类上下文:INotifyPropertyChanged
{
公共静态上下文This{get;set;}=new Context();
公共静态字符串RoutingPipeTypeName
{
get=>\u routingPipeTypeName;
设置
{
if(_routingPipeTypeName!=值)
{
_routingPipeTypeName=值;
此.OnPropertyChanged(名称为(RoutingPipeTypeName));
}
}
}
公共静态列表可用参数
{
get=>\u可用的参数;
设置
{
//检查新列表的元素是否不相等
如果(!value.All(_availableDiameters.Contains))
{
_可用参数=值;
此.OnPropertyChanged(名称(可用参数));
}
}
}
公共事件属性更改事件处理程序属性更改;
私有void OnPropertyChanged(字符串propertyName)
{
PropertyChanged?.Invoke(这是新的PropertyChangedEventArgs(propertyName));
}
}
xaml:

以及负责更新直径列表的客户端类:

public void InitializeUIContext()
{
    Context.This.PropertyChanged += UIContextChanged;

    if (Cache.CachedPipeTypes.Count > 0)
        Context.RoutingPipeTypeName = Cache.CachedPipeTypes.First().Key;
}

private void UIContextChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
    if (e.PropertyName == nameof(Context.RoutingPipeTypeName))
    {
        Context.AvailableDiameters = Cache.CachedPipeTypes.First().Value.GetAvailableDiameters();
    }
}
我希望这样的设置会在每次更改“管道类型”属性上的选择时更新“直径”组合框。
相反,它只在视图初始化时更新一次。。。为什么?

不要使用静态属性绑定到对象(已正确传递到视图的
DataContext

声明不带
静态
修饰符的属性,并将
此.OnPropertyChanged
替换为
OnPropertyChanged

public string RoutingPipeTypeName
{
    get => _routingPipeTypeName;
    set
    {
        if (_routingPipeTypeName != value)
        {
            _routingPipeTypeName = value;
            OnPropertyChanged(nameof(RoutingPipeTypeName));
        }
    }
}
您还应该从上下文类中删除
静态This
,只需编写

public Context AppContext { get; } = new Context();

我没有看到RoutingDiameter属性。它只是一个简单的属性。现在它可以工作了。但是,真的不可能为这种绑定使用静态属性吗?在我的解决方案中,有几个地方使用了这些属性。这就是为什么我将它们设置为静态,现在我调整了设置,使其在没有静态的情况下工作。但我还是很好奇,绑定到静态属性当然是可能的,但您不会为这些绑定设置视图的DataContext,因为不会有源对象。它们有不同的语法,例如,请参见:
public string RoutingPipeTypeName
{
    get => _routingPipeTypeName;
    set
    {
        if (_routingPipeTypeName != value)
        {
            _routingPipeTypeName = value;
            OnPropertyChanged(nameof(RoutingPipeTypeName));
        }
    }
}
public Context AppContext { get; } = new Context();