1

在调查一个看似无关的问题时,我遇到了一些意想不到的绑定行为。有

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

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

为什么?

4

2 回答 2

2

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

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

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

于 2012-06-10T06:38:20.663 回答
1

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

为此,请 make ObservableKeyedCollectionimplement INotifyPropertyChanged,然后将以下代码添加到OnCollectionChanged

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

另请参阅此答案: PropertyChanged for indexer property

于 2012-06-10T10:34:42.250 回答