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