0

当我绑定时,对 a 说 a Labelstring我以这种方式定义字符串:

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

INotifyPropertyChanged在我的课堂上实现了接口。

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

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

4

2 回答 2

5

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

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

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

这是确保您的收藏永远不会为空的好方法

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

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

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

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

于 2013-06-06T21:57:06.890 回答
1

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

于 2013-06-06T21:53:27.807 回答