【问题标题】:When to use event and command for WPF/MVVM?何时对 WPF/MVVM 使用事件和命令?
【发布时间】:2013-06-11 01:48:38
【问题描述】:
我正在练习如何使用 MVVM 模式编写 WPF 应用程序。到目前为止,我还没有在我的代码中使用命令。在我的 Viewmodel 中,我实现了 INotifyPropertyChanged 并使用 (event PropertyChangedEventHandler PropertyChanged) 来触发事件。
为什么我感觉还是怀念 WPF 关于如何使用命令的一些概念?
什么时候适合使用命令?
【问题讨论】:
标签:
c#
wpf
events
mvvm
command
【解决方案1】:
WPF 中的Commands 用于抽象用户触发的操作(例如单击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
}
}
还有你的观点:
<StackPanel>
<TextBox Text="{Binding SearchText, UpdateSourceTrigger=PropertyChanged}">
<TextBox.InputBindings>
<KeyBinding Key="Enter" Command="{Binding SearchCommand}"/>
</TextBox.InputBindings>
</TextBox>
<Button Content="Search" Command="{Binding SearchCommand}"/>
</StackPanel>
请注意KeyBinding 和按钮的Command 属性如何都绑定到 ViewModel 中的同一命令 (SearchCommand)。这有助于重用,也有助于保持 ViewModel 中的实际逻辑及其所有优点(可测试性等),同时保持视图清洁和无代码。
【解决方案2】:
有趣的是,绝对不需要使用 WPF 中的原始 Commands 概念 :)。只需使用 MVVM 和免费的开源应用程序框架库,您就可以构建具有松耦合设计 (xaml) 和业务逻辑(c#/vb 代码)的所有优点的大型复杂应用程序Caliburn.Micro强>。
免责声明:我只是这个库的快乐用户,与它的创建者无关,所以这不是付费广告或类似的东西。
请看一下这个来自官方文档的非常基本的示例:
--> Basic Configuration, Actions and Conventions
并且您将将 XAML 视图中的事件直接绑定到 C# 视图模型中的方法,而无需用于命令声明和注册的代理代码混乱(就像在其他类似的应用程序框架)。
别介意这个示例是 Silverlight 应用程序 - Caliburn.Micro 支持所有主要的 Xaml 平台几乎相同的方式,WPF 示例看起来很像上面基于 Silverlight 的。
除了提到的主要功能(绑定到方法)之外,Caliburn.Micro 还具有:
- 方便的预定义绑定命名约定,使您的 XAML 文件保持干净和可读(但仍然对设计时友好!)
-
INotifyPropertyChanged 的基本实现,以便您可以从中继承所有视图模型
- 基类用于实现常用场景,例如:
-
EventAggregator 用于视图模型和其他类之间更松散耦合的通信
- 松耦合支持键盘焦点和窗口管理(针对 WPF)
- 还有更多 :)
只要给它机会,你就永远不需要普通的 WPF 命令 ;)