我正在开发一个WPF应用程序,我希望父元素中的一个事件能够通知元素树中的几个子节点,这样每个子节点都可以相应地执行操作。我知道通过向上冒泡事件,可以使用自定义RoutedEvent
从孩子到其中一个祖先的另一个方向发信号,这样任何祖先元素都可以处理事件。我想要的是孩子们被告知父母的事件并且他们适当地处理它们。实现这一目标的最佳策略是什么?
修改
澄清评论:说我有父母UserControl
。它有一个TabControl
,其内容是几个嵌套的子UserControl
。现在考虑一个场景,我希望TabControl.SelectionChanged()
事件在每个子UserControl
中引起一些更改。怎么做到这一点? (每个标签的内容都是UserControl
,其中可能包含其他几个级别的子级UserControl
。我希望底层的UserControl
了解SelectionChanged()
事件并做出相应的回应)。
答案 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>