跨元素树分支的WPF路由事件

时间:2008-10-08 18:53:00

标签: wpf routed-commands

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

  

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

这是来自WPF Article

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

基本上从我的应用程序中的任何位置触发事件(保存,状态更新,选择更改等等),然后将其处理到其他地方,而不知道彼此的任何事情。这可能吗?

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

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

最好的机制是重构数据视图并将其与数据模型分开。

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

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

答案 1 :(得分:1)

如果要在元素之间传输数据,Binding是可行的方法。网上有很多关于此的教程和书籍。

如果要实现Style更改,则可以使用DataTriggers,它也会使用绑定。

无法在不相关的控件之间发送传统意义上的事件,而无需在公共根目录中进行连接。