我正在使用反编译器在ObservableCollection<T>
中四处查看,看到了一些以前从未见过的奇怪的OnPropertyChanged
代码。
public class ObservableCollection<T> : Collection<T>, INotifyCollectionChanged, INotifyPropertyChanged
{
private const string IndexerName = "Item[]";
protected override void ClearItems()
{
...
base.OnPropertyChanged("Count");
base.OnPropertyChanged("Item[]");
...
}
}
OnPropertyChanged("Item[]")
调用有什么作用,在编写自己的代码时会有什么帮助?它必须执行与标准
OnPropertyChanged
调用不同的操作,因为“ Item”不是对象的属性,并且“ []
”肯定不是“ any”属性名称的一部分。 最佳答案
必须遵循OnPropertyChanged("Item[]")
的精神来调用INotifyPropertyChanged
。默认索引器Item
返回的数据已更改。
在您的特定示例中,集合已被清除,因此,如果将集合索引到特定项目中,则需要通知您感兴趣的对象引用可能不同。
编辑
凯文(Kevin)关于绑定到索引器的评论之后,我写了一个应用程序来测试绑定。
我创建了一个ObservableCollection<int>
并按如下方式填充:
this.Indexed.Add(1);
this.Indexed.Add(2);
this.Indexed.Add(3);
如果通过这样的索引器绑定到某物,它将显示
3
:<TextBlock Text="{Binding Indexed[2]}" />
然后在运行时在该索引处更改对象,
this.Indexed.Insert(2, 10);
TextBlock
将更新并显示新值10
。关于.net - 在ObservableCollection内部,base.OnPropertyChanged(“Item []”)有什么作用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11871720/