何时使用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命令;)