何时使用WPF / MVVM的事件和命令?

我正在练习如何使用MVVM模式编写WPF应用程序。 到目前为止,我还没有在我的代码中使用命令。 在我的Viewmodel中,我实现了INotifyPropertyChanged并使用(事件PropertyChangedEventHandler PropertyChanged )来触发事件。 为什么我觉得我仍然想念WPF关于如何使用命令的概念?

何时适合使用命令?

WPF中的命令用于抽象用户触发的操作(例如单击Button或按键。

这是一个基本的例子:

假设您想在用户单击“搜索”按钮时搜索数据库中的员工,或者在聚焦搜索框时点击回车键。

您可以像这样定义ViewModel:

 public class MyViewModel: ViewModelBase { public string SearchText {get;set;} //NotifyPropertyChanged, etc. public Command SearchCommand {get;set;} public MyViewModel() { //Instantiate command SearchCommand = new DelegateCommand(OnSearch); } private void OnSearch() { //... Execute search based on SearchText } } 

而你的观点:

         

请注意KeyBinding和Button的Command属性如何绑定到ViewModel中的同一Command( SearchCommand )。 这有利于重用,还有助于保持ViewModel中的实际逻辑,具有所有优点(可测试性等),同时保持视图干净和无代码。

有趣的是,绝对不需要使用WPF中的原始命令概念:)。 您可以构建大型复杂的应用程序,只需使用MVVM和免费的开源应用程序框架库Caliburn.Micro ,就可以实现松散耦合设计(xaml)和业务逻辑(c#/ vb代码)的所有优点

免责声明 :我只是这个图书馆的快乐用户,与其创作者没有任何关系,所以这不是付费广告或类似的东西。

从官方文档中查看这个非常基本的示例

– > 基本配置,操作和约定 < -

并且您将把XAML视图绑定事件的强大function直接填充到C#视图模型中的方法,而不会出现用于命令声明和注册的代理代码(这在其他类似的应用程序框架中实现)。

并且不要紧,这个示例是Silverligh应用程序 – Caliburn.Micro几乎以相同的方式支持所有主要的Xaml平台 ,并且WPF示例看起来非常类似于基于Silverlight的。

除了提到的主要function(buinding to methods)之外,Caliburn.Micro还有:

  • 方便的预定义绑定命名约定,使您的XAML文件清晰可读(但仍然设计时友好!)
  • INotifyPropertyChanged的基本实现,以便您可以从它inheritance所有视图模型
  • 基础类别用于实施常用场景,例如:
    • 主详细信息
    • 亲子
    • 列表以选择项
  • EventAggregator用于在视图模型和其他类之间进行更松散耦合的通信
  • 松散耦合支持键盘焦点和窗口管理(用于WPF)
  • 再多一点:)

只要给它机会,你将永远不需要vanilla WPF命令;)