我正在使用反编译器在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/

10-10 17:29