在以某种语法声明时,INotifyPropertyChanged不会触发

时间:2012-06-10 04:15:53

标签: wpf binding inotifypropertychanged

在调查a seemingly unrelated issue时,我遇到了一些意想不到的绑定行为。具有

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}" />

创造奇迹,事件开始正确开启。

为什么?

2 个答案:

答案 0 :(得分:2)

在第二个xaml示例中,绑定正在观察一个实现INotifyPropertyChanged的StringRecord,因此会通知对象的更改。

在第一个xaml示例中,您不清楚绑定的是什么。

如果将DataContext设置为Container,则绑定正在观察未实现INotifyPropertyChanged接口的对象。由于路径仍然正确,因此仍然可以读取Value属性,但是您错过了通知。

答案 1 :(得分:1)

如果您希望绑定系统了解通过字符串索引访问的属性的更改,ObservableKeyedCollection类需要触发PropertyChanged事件以及CollectionChanged事件。

要执行此操作,请ObservableKeyedCollection实施INotifyPropertyChanged,然后将以下代码添加到OnCollectionChanged

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

另见答案:PropertyChanged for indexer property