我正在练习如何使用 MVVM 模式编写 WPF 应用程序。到目前为止,我还没有在我的代码中使用命令。在我的 Viewmodel 中,我实现INotifyPropertyChanged
并使用 (event PropertyChangedEventHandler PropertyChanged
) 来触发事件。为什么我觉得我仍然怀念一些关于如何使用命令的 WPF 概念?
什么时候适合使用命令?
WPF 中的命令用于抽象用户触发的操作(例如单击 aButton
或按下某个键。
这是一个基本示例:
假设您想在用户单击“搜索”按钮时在数据库中搜索员工,或者在聚焦搜索框时按下回车键。
你可以像这样定义你的 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
和 Button 的Command
属性是如何绑定到SearchCommand
ViewModel 中的同一个 Command ( ) 的。这有助于重用,也有助于保持 ViewModel 中的实际逻辑及其所有优点(可测试性等),同时保持视图清洁和无代码。
有趣的是,绝对不需要使用 WPF 的原始命令概念 :)。只需使用 MVVM 和免费的开源应用程序框架库Caliburn.Micro,您就可以构建具有松散耦合设计 (xaml) 和业务逻辑 (c#/vb 代码) 的所有优点的大型复杂应用程序。
免责声明:我只是这个图书馆的快乐用户,与它的创建者无关,所以这不是付费广告或类似的东西。
请从官方文档中查看这个非常基本的示例:
-->基本配置、操作和约定<--
并且您可以将XAML 视图中的事件直接绑定到 C# 视图模型中的方法,而无需用于命令声明和注册的代理代码(就像在其他类似的应用程序框架中实现的那样)。
别介意这个示例是 Silverlight 应用程序 - Caliburn.Micro以几乎相同的方式支持所有主要的 Xaml 平台,并且 WPF 示例看起来很像上面基于 Silverlight 的示例。
除了提到的主要功能(绑定到方法)之外,Caliburn.Micro 还具有:
只要给它机会,你就永远不需要香草 WPF 命令;)