问题的信息:
我试图了解如何在对象和集合上正确实现INotifyPropertyChanged
。
首先,这是我的ViewModelBase类:
public abstract class ViewModelBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertychanged([CallerMemberName] string propertyName = "")
{
var handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}
考虑我有一个名为Person
的课程:
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
public string Age { get; set; }
}
要使用INotifyPropertyChanged
,我见过的大多数示例都会将Person类更改为以下内容:
public class Person
{
public int Id { get; set; }
private string _name;
public string Name
{
get { return _name; }
set
{
_name = value;
OnPropertychanged();
}
}
private string _age;
public string Age
{
get { return _age; }
set
{
_age = value;
OnPropertychanged();
}
}
}
在对象的一个实例上使用一次时似乎完全相同(如果有很多属性,这可能很有用):
private Person _person;
public Person MyPerson
{
get { return _person; }
set
{
_person = value;
OnPropertychanged();
}
}
实际问题:
1 - 是否与一个对象实例上的每个属性相比调用OnPropertychanged()
是否会产生差异(除了代码量之外)? (两者都被认为是好习惯吗?)
2 - 如果在对象实例上设置OnPropertychanged()
是一个好习惯,我是否正确创建这样的ObservableCollection
?:
var PersonCollection = new ObservableCollection<MyPerson>();
答案 0 :(得分:1)
1)好吧,如果你想在对象实例上调用它,那么每次在绑定时使用这样的类时都需要这样做。当您在课堂上直接实施OnNotifyPropertyChanged
时,您不需要在以后关注它......
2)INotifyPropertyChanged
的类不需要Observable集合。但是,当您绑定colection时,必须执行一些UI控件(ListBox
,ListView
)并希望添加/删除其元素。然后,Observable collection将确保UI得到更新。
答案 1 :(得分:1)
ObservableCollections对象...在此集合中添加和删除时,将通知UI更改(顶级)。如果你有一个&#34; ObservableCollection of Person&#34;并且您更改列表中某个对象(Person)上的属性,UI将不会更新,除非您的&#34; Person&#34; class实现了INotifyPropertyChanged接口,该接口可以放入一个所有类都可以继承的基类,就像你的例子一样。希望这会有帮助。