WPF入門(2)——數據綁定與INotifyPropertyChanged(INPC)


接上篇,我們在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

參考資料:
https://intellitect.com/getting-started-model-view-viewmodel-mvvm-pattern-using-windows-presentation-framework-wpf/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM