我們先來看看微軟官方給出的定語:通知客戶端屬性值已經更改。其實對于一個陌生小白來說,很難通過這句話來理解其中的原理,這個接口在WPF和Winform編程中經常會用到,下面是該接口的定義:
namespace System.ComponentModel
{//// Summary:// Notifies clients that a property value has changed.public interface INotifyPropertyChanged{//// Summary:// Occurs when a property value changes.event PropertyChangedEventHandler? PropertyChanged;}
}
我們通過一個簡單的例子對比來理解一下它具體作用,我們定義一個普通的Person類,該類沒有實現INotifyPropertyChanged接口
public class Person{private string name = String.Empty;public string Name{get{return name;}set{this.name = value;}}}
接下來我們用WPF來實現一個簡單的綁定,頁面加載的時候在文本框中默認綁定Person屬性,我們通過一個按鈕來改變對象的屬性,來查看文本框中的值是否發生變化
<Grid><Grid.RowDefinitions><RowDefinition></RowDefinition><RowDefinition></RowDefinition></Grid.RowDefinitions><TextBox Grid.Row="0" Grid.Column="0" Height="30" Width="200" Text="{Binding Path=Name}" ></TextBox><Button x:Name="btnChangeProperty" Width="100" Height="50" Grid.Row="1" Grid.Column="0" Click="btnChangeProperty_Click">更改屬性</Button></Grid>
public partial class MainWindow : Window{Person person = new Person();public MainWindow(){InitializeComponent();person.Name = "桂兵兵";this.DataContext?=?person;}private void btnChangeProperty_Click(object sender, RoutedEventArgs e){person.Name = "桂素偉";}
通過上面的例子我們看到TextBox中的值并沒有發生變化
我們讓Person來實現INotifyPropertyChanged接口,依然是上面的例子
public?class?Person?:?INotifyPropertyChanged{private string name = String.Empty;public string Name{get{return name;}set{if (value != this.name){this.name = value;NotifyPropertyChanged();}}}public event PropertyChangedEventHandler? PropertyChanged;private void NotifyPropertyChanged([CallerMemberName] String propertyName = ""){PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));}
}
當我們看到通過按鈕改變實體類屬性的時候,頁面綁定的值也改變了,這個就是INotifyPropertyChanged接口起到的效果
通俗點講,當我們綁定一個對象屬性的時候,如果該對象實現了INotifyPropertyChanged接口,數據綁定會訂閱該接口中的事件,當屬性發生變化的時候,會通知到數據綁定!