我刚开始在应用程序中使用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中的一个方法,静态ICommand是这样的:
public static readonly ICommand OpenRecentFile =
new RoutedCommand("Open Recent", typeof(MainWindow));
我还看到ViewModel上有一个属性,其类型为ICommand,它在视图中绑定到这样:
<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;
}
}
每种方法有哪些好处/缺点?
答案 0 :(得分:8)
这取决于您的设计。如果你想采用快速方法 - 一个带有后端代码的Window,那么在XAML中声明命令可能会节省你一些时间并减少长期工作量。
如果您要使用MVVM应用程序,那么我强烈建议绑定到ICommand,因为命令通常是操作数据的方式(打开/保存/编辑),这应该在ViewModel中定义。可能更多的努力取决于功能,但如果你做一个更大的应用程序,MVVM是一个很好的方法。
最终两者都会起作用,但这是你的设计和方法。
答案 1 :(得分:6)
我认为这些之间的主要区别在于第一个版本的路由性质。路由方面可以使命令在某些情况下更强大,但它也可能导致更多的痛苦。如果你试图让命令执行,但是目标ui元素没有焦点,那么痛苦就会发挥作用。
基于属性的ICommand实现将始终有效,因为命令调用和命令传递之间没有“路由”步骤。
除非我的场景需要路由提供的功能,否则我倾向于使用基于属性的命令。