在某些语法声明时INotifyPropertyChanged的不火(INotifyPropertyC

2019-10-16 20:00发布

虽然在调查一个看似不相关的问题 ,我已经打了一些意想不到的绑定行为。 有

class StringRecord : INotifyPropertyChanged
{
    public string Key {get; set; }    // real INPC implementation is omitted
    public string Value { get; set; } // real INPC implementation is omitted
    ...
}

class Container
{
    public ObservableKeyedCollection<string, StringRecord> Params { get; set; }
    ...
{

现在,当一个TextBox绑定到明显的方式收集项目之一

<TextBox Text="{Binding Params[APN_HOST].Value}" />

该StringRecord的实例的PropertyChanged事件不会开火编辑文本。 但是,重写它作为

<TextBox DataContext="{Binding Params[APN_HOST]}" Text="{Binding Value}" />

使得奇迹,事件开始正确触发。

为什么?

Answer 1:

在第二个样品XAML的结合被观察StringRecord其中实现INotifyPropertyChanged并因此被通知更改对象的。

在第一个XAML样本,目前还不清楚是什么你结合。

如果您设置的DataContext到Container的结合被观察对象没有实现INotifyPropertyChanged接口。 由于路径仍是正确的Value属性仍然可以读,但你是在通知错过了。



Answer 2:

ObservableKeyedCollection类需要触发PropertyChanged事件以及CollectionChanged事件,如果你想绑定系统了解变化通过字符串索引访问的属性。

要做到这一点,让ObservableKeyedCollection实现INotifyPropertyChanged ,然后将下面的代码添加到OnCollectionChanged

if (PropertyChanged != null)
{
    PropertyChanged(this, new PropertyChangedEventArgs("Item[]"));
}

也看到这个答案: 的PropertyChanged的索引器属性 。



文章来源: INotifyPropertyChanged doesn't fire when declared in certain syntax