3

我在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”不是对象上的属性,并且“ []”肯定不是“任何”属性名称的一部分。

4

1 回答 1

2

调用 toOnPropertyChanged("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

于 2012-08-08T19:54:04.993 回答