MVVM架构浅谈 – INotifyPropertyChanged

在开发WPF或这UWP时,通常我们会使用MVVM模式。在使用该模式框架时,我们使用INotifyPropertyChanged通知页面修改。下面聊聊INotifyPropertyChanged的使用。

先创建一个NotifyPropertyChanged的共用类。

public class NotifyPropertyChanged : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    protected void OnPropertyChanged1([CallerMemberName] string propertyName ="")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

   protected void UpdateProperty(ref T oldValue, T newValue,
         [CallerMemberName] string propertyName = "")
    {
        if (Equals(newValue, oldValue)) return;
        oldValue = newValue;

        if (string.IsNullOrEmpty(propertyName)) return;
        OnPropertyChanged(propertyName);
    }
}

然后创建一个ViewModel类继承上面代码,该类绑定了界面的控件。

public class Person: NotifyPropertyChanged
{
    string name;
    public string Name
    {
        get {return name;}
        set
        {
            if (Equals(name,value)) return;

            name=value;
            OnPropertyChanged(nameof(Name));
        }
    }

    int age;
    public int Age
    {
        get { return age;}
        set
        {
            if(Equals(age,value)) return;

            age=value;
            OnPropertyChanged1();
        }
    }

    string gender;
    public string Gender
    {
        get {return gender;}
        set
        {
            UpdateProperty(ref gender,value);
        }
    }
}

上述代码中,三个属性分别使用了不同的通知属性修改事件的写法。

1、Name属性使用了 OnPropertyChanged(nameof(Name))。这就是我们一般使用的方法,使用 nameof(Name) 会比我们直接硬输入 “Name” 要好些,直接输入字符串容易出现错误。

2、Age属性使用了 OnPropertyChanged1()。我们可以看到在这个方法里 PropertyName前面加了一个修饰特性 [CallerMemberName],该特性能够自动获取属性的名称。该特性只支持.Net 4.5以上的框架。

3、Gender属性使用了 UpdateProperty(…)。在这个方法里就包含了赋值方式,以及[CallerMemberName]修饰特性,减少了外部的重复代码量。

这三种方法都可以,根据实际情况选择不同的写法。

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s