【问题标题】:Is INotifyPropertyChanged needed for binding ObservableCollection?绑定 ObservableCollection 是否需要 INotifyPropertyChanged?
【发布时间】:2013-06-03 02:14:02
【问题描述】:

当我绑定时,将Label 说成string,我这样定义字符串:

private string _lbl;
public string Lbl
    {
     get
     {
          return = _lbl;
     }
      set
     {
         _lbl=value;
          OnPropertyChanged("Lbl");
     }
}

在我的类中实现了INotifyPropertyChanged 接口。

我应该以相同的方式定义 ObservableCollection 还是我可以保持这种方式?

public ObservableCollection<File> myFiles {get; set;}

【问题讨论】:

    标签: c# wpf binding observablecollection inotifypropertychanged


    【解决方案1】:

    作为一般规则,我倾向于这样定义 ObservableCollections:

        private ObservableCollection<Item> _items;
        public ObservableCollection<Item> Items
        {
            get { return _items ?? (_items = new ObservableCollection<Item>()); }
        }
    

    这称为“延迟初始化”,其中 ObservableCollection 仅在第一次访问时实例化。

    这是确保您的Collection Will Never Be Null 的好方法

    请注意,它没有设置器,因为 ObservableCollection 不是您通常分配的东西。相反,如果您想完全替换项目,请执行以下操作:

    Items.Clear();
    //... Add all the new items
    

    这避免了 WPF 必须重新绑定所有 CollectionChanged 事件和内容,以便侦听和响应从集合中添加/删除的项目。您永远只有 1 个集合实例。无论您在上面放置什么物品,收藏品都保持不变。

    不要与集合的ITEMS 中的PropertyChange 通知混淆。 WPF 分别处理这些概念,因为属性更改由 ITEMS 通知,而 Collection 更改(添加或删除项)由 Collection 本身通知。

    【讨论】:

    • 感谢您的回答,但最后几句话让我有点困惑。如果我将一个项目添加到这样定义的 ObservableCollection 中,我绑定到该集合的每个元素都会自动更新? (我想是的,但只是为了确定..)
    • Items 不是属性吗?我相信它被定义为一种属性。
    • @sturm 这是一个属性。但它是一个永远不会更改的只读属性,因此不需要更改通知。
    • 然后 Items.Add(myItem);不被视为更改 Items 属性而是 CollectionChanged?
    • @Sturm 完全正确。您不会更改“Items”属性本身,而是将项目添加到集合中,并且集合会引发 CollectionChanged 事件。
    【解决方案2】:

    如果 myFiles 属性可以更改,那么可以,您应该引发 PropertyChanged 事件。如果没有(也就是说,如果它没有设置器,或者它有一个只设置一次的私有设置器,例如在构造函数中),那么您不需要引发事件。集合本身会引发其自己的 PropertyChanged 和 CollectionChanged 事件,但如果包含该集合的属性发生更改,则包含该集合的对象必须引发 PropertyChanged。

    【讨论】:

    • 洞在哪里? ObservableCollection 属性完全改变的有效用例。
    • 啊。没有二传手的场景。已编辑。
    • 删除了反对票。不过,我的解决方案在性能方面更好。
    • 不是这样。如果始终使用 Items 属性,并且多次使用它,那么您的延迟初始化会损害性能。一切都与用例有关。
    • If the Items property is always used, and it is used more than once, then your lazy-initialization hurts performance. - 你能解释一下吗?我想你不明白我的代码是做什么的。它只会在第一次访问时对集合进行一次实例化。不管用途如何。
    猜你喜欢
    • 2013-03-30
    • 2012-05-04
    • 2014-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-20
    • 2013-09-09
    • 2011-12-17
    相关资源
    最近更新 更多