【问题标题】:What does base.OnPropertyChanged("Item[]") do inside ObservableCollection?base.OnPropertyChanged("Item[]") 在 ObservableCollection 中做了什么?
【发布时间】:2012-08-08 19:24:47
【问题描述】:

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

【问题讨论】:

  • 我很确定它会通知绑定到集合的任何项目已更改。
  • @mydogisbox 如果您指的是检测添加/删除的项目,则由 INotifyCollectionChanged 及其 CollectionChanged 事件处理。如果您指的是检测集合中某个项目的属性更改,则超出了 ObservableCollection 的范围。

标签: .net wpf observablecollection inotifypropertychanged


【解决方案1】:

调用OnPropertyChanged("Item[]") 需要遵循INotifyPropertyChanged 的精神。默认索引器Item返回的数据发生了变化。

在您的具体示例中,该集合已被清除,因此,如果您要将集合索引到特定项目,则需要通知您您感兴趣的对象引用可能不同。

编辑

在 Kevin 关于绑定到索引器的评论之后,我编写了一个应用程序来测试绑定。

我创建了一个ObservableCollection&lt;int&gt; 并填充如下:

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

【讨论】:

  • 我想我误解了与索引器绑定的工作原理。你是说如果你有&lt;TextBox Text="{Binding MyObservableCollection[2]}" /&gt; Text 属性有一个实时绑定到ObservableCollection 并且不直接绑定到项目本身?我从来没有这样想过,但这似乎表明如果我进入代码并执行ObservableCollection.Insert(2, newItem),那么 UI 将更新并显示新项目。如果经过深思熟虑,就很有意义。
  • 我不确定该绑定是否会更新。我的主要想法是,如果它没有为 Item 属性引发事件,那么它就不会准确地实现 INotifyPropertyChanged。
  • 我刚刚编写了一个测试应用程序来看看会发生什么,并且您的绑定建议有效。我将编辑答案以包含重要的 XAML。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-28
  • 2014-08-03
  • 2012-02-12
  • 2010-10-26
  • 2019-07-12
  • 2010-11-20
  • 2011-07-24
相关资源
最近更新 更多