该模型

该模型是 M VVM 中的第一个 M 。该模型通常是一个包含你希望通过某种用户界面公开的数据的类。

这是一个非常简单的模型类,它暴露了几个属性: -

public class Customer : INotifyPropertyChanged
{
    private string _forename;
    private string _surname;
    private bool _isValid;

    public event PropertyChangedEventHandler PropertyChanged;

    /// <summary>
    /// Customer forename.
    /// </summary>
    public string Forename
    {
        get
        {
            return _forename;
        }
        set
        {
            if (_forename != value)
            {
                _forename = value;
                OnPropertyChanged();
                SetIsValid();
            }
        }
    }

    /// <summary>
    /// Customer surname.
    /// </summary>
    public string Surname
    {
        get
        {
            return _surname;
        }
        set
        {
            if (_surname != value)
            {
                _surname = value;
                OnPropertyChanged();
                SetIsValid();
            }
        }
    }

    /// <summary>
    /// Indicates whether the model is in a valid state or not.
    /// </summary>
    public bool IsValid
    {
        get
        {
            return _isValid;
        }
        set
        {
            if (_isValid != value)
            {
                _isValid = value;
                OnPropertyChanged();
            }
        }
    }

    /// <summary>
    /// Sets the value of the IsValid property.
    /// </summary>
    private void SetIsValid()
    {
        IsValid = !string.IsNullOrEmpty(Forename) && !string.IsNullOrEmpty(Surname);
    }

    /// <summary>
    /// Raises the PropertyChanged event.
    /// </summary>
    /// <param name="propertyName">Name of the property.</param>
    private void OnPropertyChanged([CallerMemberName] string propertyName = "")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

该类实现了 INotifyPropertyChanged 接口,该接口公开了 PropertyChanged 事件。只要其中一个属性值发生更改,就会引发此事件 - 你可以在上面的代码中看到这一点。PropertyChanged 事件是 WPF 数据绑定机制中的关键部分,因为没有它,用户界面将无法反映对属性值的更改。

该模型还包含一个非常简单的验证例程,可以从属性设置器中调用。它设置一个公共属性,指示模型是否处于有效状态。我已经包含了这个功能来演示 WPF 命令特殊功能,你很快就会看到它。 WPF 框架提供了许多更复杂的验证方法,但这些方法超出了本文的范围