RoutedUICommand在MVVM中的应用

5
我在我的应用程序中遇到了MVVM的问题。我有一个TabControl,每个选项卡都托管一个控件,允许以某种方式编辑文件,例如文本文件或图像。每个控件都绑定到来自ViewModel区域的类(如图所示)。我还有RoutedUICommands之一是WordWrap,仅在文本文件的情况下才有意义。此命令在MenuItem或Button等中使用。我希望仅在文本控件是此命令的目标时才启用它。如何根据MVVM正确地执行此操作?
更多细节:

diagram image

窗口的 XAML 包含:

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

一个菜单项被这样使用:
<MenuItem Command="local:EditorCommands.WordWrap"/>

首先是Executed和CanExecute事件处理程序:它们在Window类中,尽管我对MVVM的理解是,逻辑应该仅存在于ViewModel中。

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

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

1个回答

4

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

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

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

如何在MVVM Light框架中使用RelayCommand

在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/

我仍在努力解决这个问题。RoutedUICommand提供了一些不错的功能,例如为菜单项提供标题和手势(例如键盘快捷方式)。 - Mark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接