Slá*_*val 5 wpf routed-commands mvvm
我在应用程序中遇到了MVVM.我有一个TabControl,其每个Tab都有一个控件,允许以某种方式编辑文件.例如,文本文件或图像.每个控件都绑定到ViewModel区域中的一个类(如图所示).我也有RoutedUICommands.其中一个命令是WordWrap,只有在文本文件的情况下才有意义.此命令在MenuItem或Button等中使用.我想仅在文本控件是此命令的目标时启用它.如何根据MVVM正确地做到这一点?
更多细节:
窗口的XAML具有:
<Window.CommandBindings>
<CommandBinding Command="local:EditorCommands.WordWrap"
Executed="WordWrapExecuted"
CanExecute="CommandCanBeExecutedWhenAnythingIsOpen"/>
</Window.CommandBindings>
Run Code Online (Sandbox Code Playgroud)
菜单项以这种方式使用:
<MenuItem Command="local:EditorCommands.WordWrap"/>
Run Code Online (Sandbox Code Playgroud)
第一件事是Executed和CanExecute事件处理程序:它们在Window类中,虽然我理解MVVM是什么,逻辑应该只在ViewModel中.
而且,这些函数中的发送者是窗口的实例.为什么它不是命令的目标?
我应该为每个命令编写自己的RoutedUICommand后继吗?
ARoutedUICommand并不真正适合在视图模型中使用,因为它从焦点元素开始搜索视觉树,并向上搜索System.Windows.Input.CommandBinding在其 CommandBindings 集合中具有匹配对象的元素,然后执行此特定 CommandBinding 的执行委托。
由于命令逻辑应驻留在视图模型中,因此您不想在视图中设置 CommandBinding 来将命令连接到可视元素。
\n\n相反,您应该创建自己的接口实现ICommand,或者使用任何 MVVM 框架中可用的接口实现。例如,MvvmLight 有一个RelayCommand类: https: //msdn.microsoft.com/en-us/magazine/dn237302.aspx。
如何将 RelayCommand 与 MVVM Light 框架结合使用
\n\n在 Prism 中,它被称为DelegateCommand: \n https://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/
\n