【问题标题】:What is the benefit of using RoutedCommands in WPF在 WPF 中使用 RoutedCommands 有什么好处
【发布时间】:2015-11-05 13:13:12
【问题描述】:

我正在努力了解在 WPF 中使用自定义路由命令比标准事件有什么好处。

假设我在静态类中声明了一个自定义 RoutedCommand,如下所示:

public static readonly RoutedCommand Foo = new RoutedCommand();

为了将它连接到 UIElement,我会这样做:

CommandBindings.Add(new CommandBinding(Commands.Foo, new ExecutedRoutedEventHandler((x, y) => {

            MessageBox.Show("Something Happend");

        })));

好的,通常以更简洁的方式,但我的第一个问题是 - 路由命令如何跟踪此特定 UI 元素具有针对它的 CommandBinding? routedcommand 是否在整个应用程序树中跟踪命令绑定,直到在其命令绑定列表中找到具有正确 routedcommand 的 UIElement?

我注意到仍然需要触发此命令,例如按钮

btn.Command = Commands.Foo;

我的下一个问题是,仅通过标准事件创建这些路由命令有什么意义?

【问题讨论】:

    标签: c# .net wpf routed-commands


    【解决方案1】:

    主要好处是它在使用 MVVM 时将应用程序的不同层分开。它将代码放在 ViewModel 中,不会污染您的视图。它还允许命令Bubble 向上可视化树,以便容器控件可以处理其子级的命令。

    从您的示例代码看来,您并没有真正使用 MVVM,因此如果您不需要冒泡(或隧道)功能,您可能不会从使用命令中获得任何好处。

    【讨论】:

    • 该命令还可以隧道(向下钻取),尽管这种情况发生的频率较低,然后会冒泡。
    • 冒泡事件将首先由最小的孩子处理;如果不处理,它将命中树上的下一个元素,直到处理?
    • 是的,它会爬上可视化树,从子节点到父节点(或在隧道的情况下从父节点到子节点),直到找到可以处理命令的东西。
    • 非常感谢您的回答,关于 MVVM 的最后一个问题,CommandBindings 集合由 UIElement 持有,这当然与我的视图相关联,那么我该如何将处理逻辑移动到我的视图模型?是否只是用我的视图模型中的方法替换 `new ExecutedRoutedEventHandler((x, y) lambda?
    • 典型模式是在返回实际命令实例的视图模型上具有只读属性ICommand,然后将视图元素的Command 绑定到视图的Command 属性模型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-17
    • 2012-01-21
    • 2011-01-15
    • 2016-01-30
    • 2019-01-16
    • 2018-01-22
    相关资源
    最近更新 更多