繁体   English   中英

XAML 中的命令绑定与 ViewModel 中的 ICommand 属性

[英]Command Binding in XAML vs ICommand Properties in ViewModel

我刚刚开始在应用程序中使用 MVVM 命令。 我找到了许多示例,并在我的代码中尝试了两种方式。 一些示例在 xaml 中具有命令绑定,如下所示:

<CommandBinding Command="local:MainWindow.OpenRecentFile" 
                Executed="{Binding OpenRecentFile_Executed}" />
...
<MenuItem Header="{x:Static culture:TextResource.RecentFilesMenuItem}" 
          Command="local:MainWindow.RecentFilesCommand" >

使用 OpenRecentFile_Executed 作为 ViewModel 中的方法和 static ICommand 如下所示:

 public static readonly ICommand OpenRecentFile = 
     new RoutedCommand("Open Recent", typeof(MainWindow));

我还看到 ViewModel 上有一个 ICommand 类型的属性,该属性绑定到 View 中,如下所示:

<MenuItem Header="Close Current File" 
          Command="{Binding CloseCurrentFileCommand}" 
          CommandParameter="{TemplateBinding DataContext}"/>

在 ViewModel 中:

private ICommand closeCurrentFileCommand;
public ICommand CloseCurrentFileCommand
{
    get
    {
        if (closeCurrentFileCommand == null)
        {
            closeCurrentFileCommand = 
                new RelayCommand(param => this.CloseCurrentCedarFile(param));
        }
        return closeCurrentFileCommand;
    }
}

每种方法的优点/缺点是什么?

这取决于您的设计。 如果您要采用快速方法 - 带有后端代码的 Window 然后在 XAML 中声明命令可能会为您节省一些时间并从长远来看减少工作量。

如果您要使用 MVVM 应用程序,那么我强烈建议绑定到 ICommand,因为命令通常是操作数据(打开/保存/编辑)的方法,这应该在 ViewModel 中定义。 可能更多的努力取决于功能,但如果您正在执行更大的应用程序,MVVM 是 go 的好方法。

最后,两者都将起作用,但重要的是您的设计和方法。

我认为这些之间的主要区别是第一个版本的路由性质。 路由方面可以让命令在某些场景下更加强大,但也会带来更多的痛苦。 如果您试图让命令执行,但目标 ui 元素没有焦点,那么痛苦可能会发挥作用。

基于属性的 ICommand 实现将始终有效,因为在命令调用和命令传递之间没有“路由”步骤。

我倾向于主要使用基于属性的命令,除非我的场景需要路由提供的功能。

暂无
暂无

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

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