是否需要INotifyPropertyChanged来绑定ObservableCollection?

时间:2013-06-06 21:50:09

标签: c# wpf binding observablecollection inotifypropertychanged

当我绑定时,向Labelstring,我就这样定义字符串:

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

在我的班级中实施INotifyPropertyChanged界面。

我应该以同样的方式定义ObservableCollection还是我可以这样离开?

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

2 个答案:

答案 0 :(得分:5)

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

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

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

这是确保Collection Will Never Be Null

的好方法

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

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

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

这不应与集合的ITEMS内的PropertyChange通知相混淆。 WPF单独处理这些概念,因为ITEMS会通知属性更改,但Collection本身会通知Collection更改(添加或删除项目)。

答案 1 :(得分:1)

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