是否所有旨在操作ViewModel的ApplicationCommands都与MVVM一起使用?

时间:2012-10-09 18:32:54

标签: mvvm mvp

静态类ApplicationCommands由许多RoutedUICommand组成,其中一些可能是纯粹的基于视图的命令(撤消/重做,剪切/复制/粘贴),但其他人最终需要使用视图模型。但是,当使用后面的命令之一(例如Save)时,没有干净的方法将命令传播到视图模型:

<CommandBindings>
    <CommandBinding Command="Save" Executed="Save_Executed" />
</CommandBindings>
....
<MenuItem Command="Save" />

这将调用代码隐藏类上的Save_Executed事件处理程序,因为它将在MVP模式中使用,但它不允许我将命令移动到MVVM中的视图模型,除非是在Save_Executed事件处理程序中使用这条丑陋的行:

((ViewModel1)this.DataContext).Save();

这也与其他命令完全不一致,例如直接在视图模型中定义的RelayCommand。由于所有这些不便,我的印象是ApplicationCommands的设计只考虑了MVP,而不是MVVM。

需要传播到视图模型的命令是否全部可用?

2 个答案:

答案 0 :(得分:0)

如果我理解你的问题,我认为如果你这样做,你可以做你想问的事。

您的ViewModel

// Call this from your ctor
 private void InitializeCommandBindings()
    {
        this.CommandBindings = new CommandBindingCollection(new[]
            {                   
        new CommandBinding(
                    ApplicationCommands.Save,
                    new ExecutedRoutedEventHandler(YourEventHandler),
                    new CanExecuteRoutedEventHandler((sender, e) => e.CanExecute = Your Logic...))
});
}

您的观点

<Button Command="{x:Static ApplicationCommands.Save}"/>

答案 1 :(得分:0)

您需要将绑定添加到视图

this.CommandBindings.AddRange(((MainViewModel)this.DataContext).CommandBindings);