【问题标题】:RoutedUICommand within MVVMMVVM 中的 RoutedUICommand
【发布时间】:2017-06-16 18:11:53
【问题描述】:

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

更多细节:

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 继承者吗?

【问题讨论】:

    标签: wpf mvvm routed-commands


    【解决方案1】:

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

    由于命令逻辑应该驻留在视图模型中,因此您不希望在视图中设置 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/

    【讨论】:

    • 我还在为此苦苦挣扎。 RoutedUICommand 提供了一些不错的功能,例如为菜单项提供标题和手势(例如键盘快捷键)。
    猜你喜欢
    • 1970-01-01
    • 2014-07-19
    • 2014-02-03
    • 1970-01-01
    • 1970-01-01
    • 2012-02-26
    • 2010-11-19
    • 2010-12-07
    • 2014-03-02
    相关资源
    最近更新 更多