MVVM

时间:2017-01-31 10:34:57

标签: wpf mvvm routed-commands

我在应用程序中遇到了MVVM。我有一个TabControl,其每个Tab都有一个控件,允许以某种方式编辑文件。例如,文本文件或图像。每个控件都绑定到ViewModel区域中的一个类(如图所示)。我也有RoutedUICommands。其中一个命令是WordWrap,只有在文本文件的情况下才有意义。此命令在MenuItem或Button等中使用。我想仅在文本控件是此命令的目标时启用它。如何根据MVVM正确地做到这一点?

更多详情:

diagram image

Window的XAML有:

<Window.CommandBindings>
<CommandBinding Command="local:EditorCommands.WordWrap"
    Executed="WordWrapExecuted"
    CanExecute="CommandCanBeExecutedWhenAnythingIsOpen"/>
</Window.CommandBindings>

菜单项以这种方式使用:

<MenuItem Command="local:EditorCommands.WordWrap"/>

第一件事是Executed和CanExecute事件处理程序:它们在Window类中,虽然我理解MVVM是什么,逻辑应该只在ViewModel中。

此外,这些函数中的发送者是窗口的实例。为什么它不是命令的目标?

我应该为每个命令编写自己的RoutedUICommand后继吗?

1 个答案:

答案 0 :(得分:1)

RoutedUICommand不适合在视图模型中使用,因为它从焦点元素中搜索可视树,并在其CommandBindings集合中搜索具有匹配的System.Windows.Input.CommandBinding对象的元素。然后为此特定CommandBinding执行Execute委托。

由于命令逻辑应驻留在视图模型中,因此您不希望在视图中设置CommandBinding以将命令连接到可视元素。

相反,您应该创建自己的ICommand接口实现,或者使用任何MVVM框架中可用的接口。例如,MvvmLight有一个RelayCommand类:https://msdn.microsoft.com/en-us/magazine/dn237302.aspx

How to use RelayCommand with the MVVM Light framework

在Prism中,它被称为DelegateCommandhttps://www.codeproject.com/Articles/1055060/DelegateCommand-and-CompositeCommand-in-Prism

有关MVVM中命令的更多信息,请参阅以下博文:https://blog.magnusmontin.net/2013/06/30/handling-events-in-an-mvvm-wpf-application/