繁体   English   中英

何时将事件和命令用于WPF / MVVM?

[英]When to use event and command for WPF/MVVM?

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

什么时候适合使用命令?

WPF中的命令用于抽象用户触发的操作(例如单击“ Button或按某个键)。

这是一个基本示例:

假设您要在用户单击“搜索”按钮或在聚焦搜索框时按Enter键时在数据库中搜索员工。

您可以这样定义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中的同一Command( SearchCommand )。 这有利于重用,还有助于将ViewModel的实际逻辑及其所有优点(可测试性等)保留在ViewModel中,同时保持视图整洁且无需编写代码。

有趣的是,绝对不需要使用WPF中的原始Commands概念:)。 您可以使用大型MVVM和免费的开源应用程序框架库Caliburn.Micro来充分利用松耦合设计(xaml)和业务逻辑(c#/ vb代码)的美感来构建大型复杂的应用程序。

免责声明 :我只是这个库的快乐用户,并且与它的创建者没有任何关系,因此这不是付费广告或类似的东西。

请看一下官方文档中的这个非常基本的示例

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

这样,您就可以将XAML视图中的事件直接绑定到C#视图模型中的方法中,而不会给命令声明和注册带来麻烦(例如在其他类似的应用程序框架中实现)代理代码。

没关系,此示例是Silverligh应用程序-Caliburn.Micro几乎以相同的方式支持所有主要的Xaml平台 ,并且WPF示例与基于Silverlight的外观非常相似。

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

  • 方便的预定义绑定命名约定,使您的XAML文件清晰易读(并且仍然对设计时友好!)
  • INotifyPropertyChanged的基本实现,以便您可以从中继承所有视图模型
  • 基本类,用于实现常见方案,例如:
    • 主细节
    • 亲子
    • 选定项目清单
  • EventAggregator用于视图模型与其他类之间的更为松散的耦合通信
  • 松散耦合的支持,例如键盘焦点和Windows管理(用于WPF)
  • 还有更多:)

只要给它机会,您就不再需要香草WPF命令;)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM