[英]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.