MVVM 中的 RoutedUICommand
RoutedUICommand within MVVM
我在应用程序中遇到 MVVM 问题。我有一个 TabControl,它的每个 Tab 都有一个允许以某种方式编辑文件的控件。例如,文本文件或图像。每个控件都绑定到 ViewModel 区域的 class(如图所示)。我也有 RoutedUICommands。这些命令之一是 WordWrap,仅在文本文件的情况下才有意义。此命令用于 MenuItem 或 Button 等。只有当文本控件是此命令的目标时,我才想启用它。如何根据MVVM正确的做?
更多详情:
XAML 对于 Window 有:
<Window.CommandBindings>
<CommandBinding Command="local:EditorCommands.WordWrap"
Executed="WordWrapExecuted"
CanExecute="CommandCanBeExecutedWhenAnythingIsOpen"/>
</Window.CommandBindings>
一个菜单项是这样使用的:
<MenuItem Command="local:EditorCommands.WordWrap"/>
首先是 Executed 和 CanExecute 事件处理程序:它们在 Window class 中,尽管我的理解是如果 MVVM 是,逻辑应该只在 ViewModel 中。
更重要的是,这些函数中的发送者是window的一个实例。为什么它不是命令的目标?
我应该为每个命令编写我自己的 RoutedUICommand 继承者吗?
A RoutedUICommand
并不真正适合在视图模型中使用,因为它从聚焦元素搜索可视化树,并向上搜索在其 CommandBindings 中具有匹配 System.Windows.Input.CommandBinding
对象的元素集合,然后执行此特定 CommandBinding 的执行委托。
由于命令逻辑应该驻留在视图模型中,您不想在视图中设置 CommandBinding 以便将命令连接到可视元素。
相反,您应该创建自己的 ICommand
接口实现或使用任何 MVVM 框架中可用的实现。例如 MvvmLight 有一个 RelayCommand
class: https://msdn.microsoft.com/en-us/magazine/dn237302.aspx.
How to use RelayCommand with the MVVM Light framework
在 Prism 中它被称为 DelegateCommand
:
https://www.codeproject.com/Articles/1055060/DelegateCommand-and-CompositeCommand-in-Prism
有关 MVVM 中的命令的更多信息,请参阅以下博客post:https://blog.magnusmontin.net/2013/06/30/handling-events-in-an-mvvm-wpf-application/
我在应用程序中遇到 MVVM 问题。我有一个 TabControl,它的每个 Tab 都有一个允许以某种方式编辑文件的控件。例如,文本文件或图像。每个控件都绑定到 ViewModel 区域的 class(如图所示)。我也有 RoutedUICommands。这些命令之一是 WordWrap,仅在文本文件的情况下才有意义。此命令用于 MenuItem 或 Button 等。只有当文本控件是此命令的目标时,我才想启用它。如何根据MVVM正确的做?
更多详情:
XAML 对于 Window 有:
<Window.CommandBindings>
<CommandBinding Command="local:EditorCommands.WordWrap"
Executed="WordWrapExecuted"
CanExecute="CommandCanBeExecutedWhenAnythingIsOpen"/>
</Window.CommandBindings>
一个菜单项是这样使用的:
<MenuItem Command="local:EditorCommands.WordWrap"/>
首先是 Executed 和 CanExecute 事件处理程序:它们在 Window class 中,尽管我的理解是如果 MVVM 是,逻辑应该只在 ViewModel 中。
更重要的是,这些函数中的发送者是window的一个实例。为什么它不是命令的目标?
我应该为每个命令编写我自己的 RoutedUICommand 继承者吗?
A RoutedUICommand
并不真正适合在视图模型中使用,因为它从聚焦元素搜索可视化树,并向上搜索在其 CommandBindings 中具有匹配 System.Windows.Input.CommandBinding
对象的元素集合,然后执行此特定 CommandBinding 的执行委托。
由于命令逻辑应该驻留在视图模型中,您不想在视图中设置 CommandBinding 以便将命令连接到可视元素。
相反,您应该创建自己的 ICommand
接口实现或使用任何 MVVM 框架中可用的实现。例如 MvvmLight 有一个 RelayCommand
class: https://msdn.microsoft.com/en-us/magazine/dn237302.aspx.
How to use RelayCommand with the MVVM Light framework
在 Prism 中它被称为 DelegateCommand
:
https://www.codeproject.com/Articles/1055060/DelegateCommand-and-CompositeCommand-in-Prism
有关 MVVM 中的命令的更多信息,请参阅以下博客post:https://blog.magnusmontin.net/2013/06/30/handling-events-in-an-mvvm-wpf-application/