wpf 视图模型
示例
视图模型是MVVM中的“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(并且您将在过程中节省一些键入操作)。