在每个属性的setter中提升OnPropertyChanged与对象的Instance

时间:2016-02-08 17:22:51

标签: wpf inotifypropertychanged

问题的信息:

我试图了解如何在对象和集合上正确实现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>();

2 个答案:

答案 0 :(得分:1)

1)好吧,如果你想在对象实例上调用它,那么每次在绑定时使用这样的类时都需要这样做。当您在课堂上直接实施OnNotifyPropertyChanged时,您不需要在以后关注它......

2)INotifyPropertyChanged的类不需要Observable集合。但是,当您绑定colection时,必须执行一些UI控件(ListBoxListView)并希望添加/删除其元素。然后,Observable collection将确保UI得到更新。

答案 1 :(得分:1)

ObservableCollections对象...在此集合中添加和删除时,将通知UI更改(顶级)。如果你有一个&#34; ObservableCollection of Person&#34;并且您更改列表中某个对象(Person)上的属性,UI将不会更新,除非您的&#34; Person&#34; class实现了INotifyPropertyChanged接口,该接口可以放入一个所有类都可以继承的基类,就像你的例子一样。希望这会有帮助。

相关问题