WPF,在元素树中通知父节点中的事件

时间:2013-10-31 06:45:43

标签: c# wpf

我正在开发一个WPF应用程序,我希望父元素中的一个事件能够通知元素树中的几个子节点,这样每个子节点都可以相应地执行操作。我知道通过向上冒泡事件,可以使用自定义RoutedEvent从孩子到其中一个祖先的另一个方向发信号,这样任何祖先元素都可以处理事件。我想要的是孩子们被告知父母的事件并且他们适当地处理它们。实现这一目标的最佳策略是什么?

修改

澄清评论:说我有父母UserControl。它有一个TabControl,其内容是几个嵌套的子UserControl。现在考虑一个场景,我希望TabControl.SelectionChanged()事件在每个子UserControl中引起一些更改。怎么做到这一点? (每个标签的内容都是UserControl,其中可能包含其他几个级别的子级UserControl。我希望底层的UserControl了解SelectionChanged()事件并做出相应的回应)。

4 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

您可以通过多种方式实施您的要求。如果您的父视图模型具有子视图模型的实例,那么您只需调用它们上的方法:

在父视图模型中:

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

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

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 :(得分:0)

答案 3 :(得分:0)

您可以尝试使用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>