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