【问题标题】:WPF Routed Events Across Element Tree BranchesWPF 跨元素树分支路由事件
【发布时间】:2010-09-16 02:31:37
【问题描述】:

我想知道在 WPF 中启用控件之间通信的正确机制是什么。我的目标是不使用常规事件,而必须手动连接它们。路由命令(隧道、冒泡)的默认行为似乎是正确的,但我想我错过了一些东西。

路由事件是 WPF 提供的一种新的基础结构,它允许事件沿着可视化树向下传送到目标元素,或者冒泡到根元素。当一个事件被引发时,它会向上或向下“移动”可视化树,在它在途中遇到的订阅该事件的任何元素上调用该事件的处理程序。 注意,这个树遍历并没有覆盖整个视觉树,只覆盖了祖先元素

来自WPF Article

使用文章中的图片,我希望“立即元素 #1”启动(引发)一个事件,然后让“立即元素 #2”处理该事件。我想实现这一点,而不必在“根元素”中添加任何代码。

基本上从我的应用程序中的任何位置触发一个事件(保存、更新状态、更改选择等),然后在其他地方处理它,而不需要两方相互了解。这可能吗?

我不相信数据绑定是答案。我想使用路由事件/命令,因为它们是在整个树中设计的,而不仅仅是在源代码管理的分支中。也许使用路由事件/命令无法完成,数据绑定就是答案。我只是不知道...

有什么想法吗?

【问题讨论】:

    标签: wpf routed-commands


    【解决方案1】:

    最好的机制是重构和分离数据视图和数据模型。

    创建一个数据模型,为每个数据点提供 DependencyProperty 属性(而不是标准 C# 属性),但不提供 UI。数据模型中的值在修改时会相互影响。

    然后,您可以将每个 WPF 元素绑定到数据模型中的相应 DependencyProperty。修改一个元素中的值,并更新所有其他元素以反映绑定属性中的任何数据模型更改。

    【讨论】:

      【解决方案2】:

      如果你想在元素之间传输数据,Binding 是要走的路。网上有很多关于这方面的教程和书籍。

      如果你想影响Style的变化,那么你可以使用DataTriggers,它也使用绑定。

      没有办法在不相关的控件之间发送传统意义上的事件,除非将其连接到公共根目录中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-06
        • 1970-01-01
        • 2014-06-22
        • 1970-01-01
        • 2010-12-31
        相关资源
        最近更新 更多