在调查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}" />
创造奇迹,事件开始正确开启。
为什么?
答案 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[]"));
}