当我绑定时,向Label
说string
,我就这样定义字符串:
private string _lbl;
public string Lbl
{
get
{
return = _lbl;
}
set
{
_lbl=value;
OnPropertyChanged("Lbl");
}
}
在我的班级中实施INotifyPropertyChanged
界面。
我应该以同样的方式定义ObservableCollection
还是我可以这样离开?
public ObservableCollection<File> myFiles {get; set;}
答案 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。