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

时间:2013-06-11 01:48:39

标签: c# wpf events mvvm command

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

何时使用命令?

2 个答案:

答案 0 :(得分:11)

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和Button的Command属性是如何绑定到ViewModel中的同一命令(SearchCommand)的。这有利于重用,还有助于保持ViewModel中的实际逻辑,具有所有优点(可测试性等),同时保持视图干净和无代码。

答案 1 :(得分:0)

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

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

请稍微查看官方文档中非常基本的样本

- &GT; Basic Configuration, Actions and Conventions&lt; -

并且您将从您的XAML视图中直接填充绑定事件的功能到C#view-model 中的方法,而不会出现用于命令声明和注册的代理代码(如此在其他类似的实现中)应用程序框架)。

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

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

  • 方便的预定义绑定命名约定使您的XAML文件保持清洁和可读(但仍然设计时友好!)
  • INotifyPropertyChanged 的基本实现,以便您可以从中继承所有视图模型
  • 基础类别用于实施常用场景,例如:
    • 主细节
    • 父子
    • list-with-selected-items
  • EventAggregator ,用于在视图模型和其他类之间进行更松散耦合的通信
  • 松散耦合支持键盘焦点和窗口管理(适用于WPF)
  • 还有一点:)

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