【问题标题】:WPF, notify a child in the element tree about an event in a parentWPF,通知元素树中的子级有关父级中的事件
【发布时间】:2013-10-31 06:45:43
【问题描述】:

我正在开发一个 WPF 应用程序,我希望将父项中的一个事件通知给元素树中的几个子项,以便他们每个人都可以相应地采取行动。我知道自定义RoutedEvent 可用于通过向上冒泡事件来向从孩子到其祖先之一的另一个方向发出信号,以便任何祖先元素都可以处理该事件。我想要的是通知孩子父母发生的事件,他们会适当地处理它们。实现这一目标的最佳策略是什么?

编辑:

澄清 cmets:假设我有一个父母 UserControl。它有一个TabControl,它的内容是几个嵌套的子UserControls。现在考虑一个场景,我希望TabControl.SelectionChanged() 事件导致每个子UserControl 发生一些变化。如何做到这一点? (每个选项卡的内容是一个UserControl,它本身可能包含另外几级子级UserControls。我希望底层的UserControl 知道SelectionChanged() 事件并做出相应的响应)。

【问题讨论】:

  • 最好的策略是附加属性和附加事件。
  • 您的问题不清楚,标题状态为“通知孩子父母发生的事件”,正文状态为“父母收到孩子的通知”。请澄清您的问题!
  • 另外请说明事件是基于数据/模型还是纯 UI 事件
  • @NickolaiNielsen 对不起,如果我不清楚.. 我写了“事件在父母中被通知给它的孩子”
  • 该事件是一个 UI 事件,不是基于数据/模型的,

标签: c# wpf


【解决方案1】:

有多种方法可以实现您的要求。如果你的父视图模型有子视图模型的实例,那么你可以简单地调用它们的方法:

在父视图模型中:

childViewModel.UpdateStatus(someDataObject);
otherChildViewModel.UpdateStatus(someDataObject);

如果您想要更多事件驱动的系统,可以使用delegates:

public delegate void Update(object someDataObject);

将该类型的属性添加到父视图模型:

public Update OnUpdate { get; set; }

将处理程序附加到父视图模型中的每个子视图:

OnUpdate += childViewModel.OnUpdateHandler;
OnUpdate += otherChildViewModel.OnUpdateHandler;

然后从父视图模型调用delegate

if (OnUpdate != null) OnUpdate(someDataObject);

如果您的父视图模型没有可以访问子视图模型对象,那么也许您可以向子视图添加属性,然后从父视图模型向它们添加Bind

<YourXmlNamespace:ChildView UpdateValue="{Binding DataContext.SomeDataObjectProperty, 
    RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type 
    YourXmlNamespace:ParentView}}}" />

【讨论】:

    【解决方案2】:

    您可以进行数据绑定或触发并监听 Ancestor TabControl.SelectedItem 已更改

    【讨论】:

      【解决方案3】:
      【解决方案4】:

      您可以尝试将子元素中的某些属性与 TabItem 的 IsSelected 绑定,类似这样的简单操作:

      <TabControl>
          <TabItem Header="Second"/>
          <TabItem Name="firstTab" Header="First" >
              <StackPanel >
                  <TextBox Height="30" Width="150" Name="tbx1" Text="{Binding ElementName=firstTab,Path=IsSelected}"/>
                  <TextBox Height="30" Width="150" Name="tbx2" Text="{Binding ElementName=firstTab,Path=IsSelected, Converter={StaticResource ResourceKey}}"/>
                  <TextBox Height="30" Width="150" Name="tbx3" Text="{Binding ElementName=firstTab,Path=IsSelected}" TextChanged="tblk3_TextChanged"/>
              </StackPanel>
          </TabItem>
      </TabControl>
      

      【讨论】:

        猜你喜欢
        • 2014-11-27
        • 1970-01-01
        • 2016-09-23
        • 2011-03-14
        • 2019-09-08
        • 2018-10-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多