wpf 视图模型

示例

视图模型是MV VM中的“ VM” 。这是一个充当中介的类,将暴露model(s)给用户界面(视图),并处理来自视图的请求,例如单击按钮引发的命令。这是一个基本的视图模型:

public class CustomerEditViewModel
{
    /// <summary>
    ///客户来编辑。
    /// </summary>
    public Customer CustomerToEdit { get; set; }

    /// <summary>
    /// The "apply changes" command
    /// </summary>
    public ICommand ApplyChangesCommand { get; private set; }

    /// <summary>
    ///构造函数
    /// </summary>
    public CustomerEditViewModel()
    {
        CustomerToEdit = new Customer
                         {
                             Forename = "John",
                             Surname = "Smith"
                         };

        ApplyChangesCommand = new RelayCommand(
            o => ExecuteApplyChangesCommand(), 
            o => CustomerToEdit.IsValid);
    }

    /// <summary>
    /// Executes the "apply changes" command.
    /// </summary>
    private void ExecuteApplyChangesCommand()
    {
        // 例如,将您的客户保存到数据库
    }
}

构造函数创建一个Customer模型对象,并将其分配给CustomerToEdit属性,以使视图可见。

构造函数还创建一个RelayCommand对象并将其分配给ApplyChangesCommand属性,再次使该对象对视图可见。WPF命令用于处理视图中的请求,例如按钮或菜单项的单击。

它RelayCommand有两个参数-第一个是在执行命令时调用的委托(例如,响应于单击按钮)。第二个参数是一个委托,它返回一个布尔值,该布尔值指示命令是否可以执行;在此示例中,它已连接到客户对象的IsValid属性。当此返回false时,它将禁用绑定到此命令的按钮或菜单项(其他控件的行为可能有所不同)。这是一个简单但有效的功能,无需根据不同的条件编写代码来启用或禁用控件。

如果确实启动并运行了此示例,请尝试清空TextBoxes之一(以将Customer模型置于无效状态)。当您离开时,TextBox应该会发现“应用”按钮被禁用。

谈客户创造

视图模型未实现INotifyPropertyChanged(INPC)。这意味着,如果将不同的Customer对象分配给CustomerToEdit属性,则视图的控件将不会更改以反映新对象TextBox-es仍将包含先前客户的姓氏和姓氏。

该示例代码之所以有效,Customer是因为在视图模型的构造函数中创建了,然后再将其分配给视图的模型DataContext(此时绑定了绑定)。在实际的应用程序中,您可能会使用构造函数以外的方法从数据库中检索客户。为此,VM应该实现INPC,并且CustomerToEdit应该更改属性以使用示例模型代码中看到的“扩展” getter和setter模式,从而PropertyChanged在setter中引发事件。

视图模型ApplyChangesCommand不需要实现INPC,因为命令不太可能更改。你需要,如果你创建了比其他构造的命令的地方,例如某种实现这种模式Initialize()的方法。

一般规则是:如果属性绑定到任何视图控件,并且该属性的值能够在构造函数中以外的任何地方更改,则实现INPC 。如果仅在构造函数中分配了属性值,则无需实现INPC(并且您将在过程中节省一些键入操作)。