使用特定属性通知WPF中的所有子控件

时间:2009-11-18 16:05:33

标签: c# wpf xaml wpf-controls

如何通知WPF中的所有subControls他们应该扩展?

并非每个SubControl都会被通知..只有那些可以通过接受另一个要素掉落。

也许你知道另一个可能性,让物品在接受特定的dropContent时改变颜色。

1 个答案:

答案 0 :(得分:1)

选项1

如果您的子控件是在您自己的代码中实现的,那么最好的方法是:

  1. 创建自定义RoutedEvent
  2. 只要您想通知子控件
  3. ,就从父级发送路由事件
  4. 处理子控件中的路由事件并使用所希望的行为进行响应(例如,如果它们是放置目标,则进行扩展)
  5. 您可以向路由事件的EventArgs添加参数,以通知子控件您正在通知他们的更改的具体细节。

    选项2

    如果您想影响您没有创建且无法控制的控件,可以使用VisualTreeHelper.GetChildrenCount()VisualTreeHelper.GetChild()以递归方式下降可视树,并根据需要对控件进行任何更改找。这比RoutedEvent方法更强大,但在许多情况下不能提供良好的抽象,导致代码从长远来看更难维护。

    选项3

    使用继承的附加属性。在父项上设置属性将导致属性向下传播到每个后代,每次调用PropertyChangedCallback。在PropertyChangedCallback中,您可以对子控件进行任何更改。

    这可能比递归下降可视树更好,因为如果将新的子控件添加到树中,您也将获得PropertyChangedCallback s。这意味着稍后添加的新子项(例如通过数据绑定)也将获得更新的功能(例如,如果它们是丢弃目标,它们也将扩展)。另一个优点是继承的属性沿逻辑树和视觉传播。缺点是它们可能比VisualTreeHelper技术慢,而且代码稍多。