静态类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。
需要传播到视图模型的命令是否全部可用?
答案 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);