wpf 模型

示例

该模型是M VVM中的第一个“ M” 。该模型通常是一个类,其中包含您要通过某种用户界面公开的数据。

这是一个非常简单的模型类,它具有几个属性:

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

    public event PropertyChangedEventHandler PropertyChanged;

    /// <summary>
    ///客户的名字。
    /// </summary>
    public string Forename
    {
        get
        {
            return _forename;
        }
        set
        {
            if (_forename != value)
            {
                _forename = value;
                OnPropertyChanged();
                SetIsValid();
            }
        }
    }

    /// <summary>
    ///客户姓氏。
    /// </summary>
    public string Surname
    {
        get
        {
            return _surname;
        }
        set
        {
            if (_surname != value)
            {
                _surname = value;
                OnPropertyChanged();
                SetIsValid();
            }
        }
    }

    /// <summary>
    ///指示模型是否处于有效状态。
    /// </summary>
    public bool IsValid
    {
        get
        {
            return _isValid;
        }
        set
        {
            if (_isValid != value)
            {
                _isValid = value;
                OnPropertyChanged();
            }
        }
    }

    /// <summary>
    ///设置IsValid属性的值。
    /// </summary>
    private void SetIsValid()
    {
        IsValid = !string.IsNullOrEmpty(Forename) && !string.IsNullOrEmpty(Surname);
    }

    /// <summary>
    ///引发PropertyChanged事件。
    /// </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框架提供了许多更复杂的验证方法,但是这些方法不在本文的讨论范围之内