C# WPF,通知元素树中的子元素有关父元素中的事件

C# WPF,通知元素树中的子元素有关父元素中的事件,c#,wpf,C#,Wpf,我正在开发一个WPF应用程序,我希望将父级中的事件通知给元素树中的几个子级,以便每个子级都可以采取相应的操作。我知道定制的RoutedEvent可以通过向上冒泡事件,在另一个方向上从子级向其祖先发送信号,以便任何祖先元素都可以处理该事件。我想让孩子们知道家长的某个事件,并妥善处理。实现这一目标的最佳策略是什么 编辑: 澄清评论:假设我有一个家长UserControl。它有一个TabControl,其内容是几个嵌套的子UserControls。现在考虑一个场景,我想要 TabValue.Sudio

我正在开发一个WPF应用程序,我希望将父级中的事件通知给元素树中的几个子级,以便每个子级都可以采取相应的操作。我知道定制的
RoutedEvent
可以通过向上冒泡事件,在另一个方向上从子级向其祖先发送信号,以便任何祖先元素都可以处理该事件。我想让孩子们知道家长的某个事件,并妥善处理。实现这一目标的最佳策略是什么

编辑:


澄清评论:假设我有一个家长
UserControl
。它有一个
TabControl
,其内容是几个嵌套的子
UserControl
s。现在考虑一个场景,我想要<代码> TabValue.SudioCudioDeD()/Case>事件,在每个子<代码> UserControl < /代码>中引起一些更改。如何做到这一点?(每个选项卡的内容都是一个
UserControl
,它本身可能包含另外几个级别的子项
UserControl
s。我希望底层的
UserControl
了解
SelectionChanged()
事件并相应地做出响应).

您可以执行数据绑定或触发并侦听祖先选项卡控件。SelectedItem changed

有许多方法可以实现您的需求。如果父视图模型具有子视图模型的实例,则可以简单地对其调用方法:

在父视图模型中:

childViewModel.UpdateStatus(someDataObject);
otherChildViewModel.UpdateStatus(someDataObject);
public Update OnUpdate { get; set; }
OnUpdate += childViewModel.OnUpdateHandler;
OnUpdate += otherChildViewModel.OnUpdateHandler;
if (OnUpdate != null) OnUpdate(someDataObject);
<YourXmlNamespace:ChildView UpdateValue="{Binding DataContext.SomeDataObjectProperty, 
    RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type 
    YourXmlNamespace:ParentView}}}" />
如果您想要一个更受事件驱动的系统,可以使用
delegate
s:

public delegate void Update(object someDataObject);
将该类型的特性添加到父视图模型:

childViewModel.UpdateStatus(someDataObject);
otherChildViewModel.UpdateStatus(someDataObject);
public Update OnUpdate { get; set; }
OnUpdate += childViewModel.OnUpdateHandler;
OnUpdate += otherChildViewModel.OnUpdateHandler;
if (OnUpdate != null) OnUpdate(someDataObject);
<YourXmlNamespace:ChildView UpdateValue="{Binding DataContext.SomeDataObjectProperty, 
    RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type 
    YourXmlNamespace:ParentView}}}" />
将处理程序附加到父视图模型中的每个子视图:

childViewModel.UpdateStatus(someDataObject);
otherChildViewModel.UpdateStatus(someDataObject);
public Update OnUpdate { get; set; }
OnUpdate += childViewModel.OnUpdateHandler;
OnUpdate += otherChildViewModel.OnUpdateHandler;
if (OnUpdate != null) OnUpdate(someDataObject);
<YourXmlNamespace:ChildView UpdateValue="{Binding DataContext.SomeDataObjectProperty, 
    RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type 
    YourXmlNamespace:ParentView}}}" />
然后从父视图模型调用
委托

childViewModel.UpdateStatus(someDataObject);
otherChildViewModel.UpdateStatus(someDataObject);
public Update OnUpdate { get; set; }
OnUpdate += childViewModel.OnUpdateHandler;
OnUpdate += otherChildViewModel.OnUpdateHandler;
if (OnUpdate != null) OnUpdate(someDataObject);
<YourXmlNamespace:ChildView UpdateValue="{Binding DataContext.SomeDataObjectProperty, 
    RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type 
    YourXmlNamespace:ParentView}}}" />
如果您的父视图模型无权访问子视图模型对象,则您可以向子视图添加属性,然后从父视图模型将属性绑定到子视图:

childViewModel.UpdateStatus(someDataObject);
otherChildViewModel.UpdateStatus(someDataObject);
public Update OnUpdate { get; set; }
OnUpdate += childViewModel.OnUpdateHandler;
OnUpdate += otherChildViewModel.OnUpdateHandler;
if (OnUpdate != null) OnUpdate(someDataObject);
<YourXmlNamespace:ChildView UpdateValue="{Binding DataContext.SomeDataObjectProperty, 
    RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type 
    YourXmlNamespace:ParentView}}}" />

我认为,此示例将帮助您:

您可以尝试将子元素中的某些属性与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>


最好的策略是附加属性和附加事件。您的问题不清楚,标题是“在父项中通知子项事件”,正文是“要通知子项的父项”。请澄清你的问题!另外,请说明事件是基于数据/模型还是纯UIevent@NickolaiNielsen对不起,我不清楚。。我写了“父级中要通知其子级的事件”该事件是一个UI事件,不是基于数据/模型的,