接上篇,我們在MainViewModel類中創建個屬性:
public string Name { get; set; }
然后去UI的xaml文件中binding一下:
此時運行程序是不會得到我們想要的結果的,因為還沒有設置DataContext。
我們去設置下DataContext:
debug下,按理說UI的button會找到DataContext的Name屬性,顯示我們的MainViewModel.Name
關於綁定的最好的事情之一是它們使UI與視圖模型中的數據保持同步。但是此時我們更改FirstName屬性,UI上是不會跟隨同步的,因為我們的MainViewModel雖然繼承了INotifyPropertyChanged接口但是我們並沒有應用。為了實現修改mainViewModel中的屬性值后就自動更新到UI上,我們需要應用該接口:
然后,為button創建個事件,當按鈕按下后修改MainViewModel的name屬性:
debug下試試:
但是,記住每次更改屬性值時都會引發事件,這會非常繁瑣。由於這種模式非常普遍,因此許多MVVM框架為您的視圖模型類提供了一個基類,類似於以下內容:
public abstract class ViewModelBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected bool SetProperty<T>(ref T field, T newValue, [CallerMemberName]string propertyName = null)
{
if(!EqualityComparer<T>.Default.Equals(field, newValue))
{
field = newValue;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
return true;
}
return false;
}
}
這使我們可以像這樣重寫Name屬性:
public class ViewModel : ViewModelBase
{
private string name;
public string Name
{
get => name;
set => SetProperty(ref name, value);
}
}
每次我們更改Name屬性時,都會引發INPC事件
工程源代碼上傳在GitHub上了:https://github.com/feipeng8848/WPF-Demo