4

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

什么时候适合使用命令?

4

2 回答 2

11

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属性是如何绑定到SearchCommandViewModel 中的同一个 Command ( ) 的。这有助于重用,也有助于保持 ViewModel 中的实际逻辑及其所有优点(可测试性等),同时保持视图清洁和无代码。

于 2013-06-11T02:27:45.047 回答
0

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

免责声明:我只是这个图书馆的快乐用户,与它的创建者无关,所以这不是付费广告或类似的东西。

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

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

并且您可以将XAML 视图中的事件直接绑定到 C# 视图模型中的方法,而无需用于命令声明和注册的代理代码(就像在其他类似的应用程序框架中实现的那样)。

别介意这个示例是 Silverlight 应用程序 - Caliburn.Micro以几乎相同的方式支持所有主要的 Xaml 平台,并且 WPF 示例看起来很像上面基于 Silverlight 的示例。

除了提到的主要功能(绑定到方法)之外,Caliburn.Micro 还具有:

  • 方便的预定义绑定命名约定,使您的 XAML 文件保持干净和可读(但仍然对设计时友好!)
  • INotifyPropertyChanged的​​基本实现,以便您可以从中继承所有视图模型
  • 基类用于实现常用场景,例如:
    • 主细节
    • 亲子
    • 带有所选项目的列表
  • EventAggregator用于视图模型和其他类之间更松散耦合的通信
  • 松耦合支持键盘焦点和窗口管理(用于 WPF)
  • 还有更多:)

只要给它机会,你就永远不需要香草 WPF 命令;)

于 2013-06-11T09:41:47.493 回答