我有TabControl
,带有模板,如下:
<TabControl ItemsSource="{Binding MyItems}" x:Name="tabs">
<TabControl.Resources>
<DataTemplate x:Key="contentTemplate" x:Name="contentTemplate" >
<other:MyUserControl x:Name="mUserControl" CustomData="{Binding}"/>
</DataTemplate>
<Style TargetType="{x:Type TabItem}">
<Setter Property="Header" Value="{Binding Name}" />
<Setter Property="ContentTemplate" Value="{StaticResource contentTemplate}"/>
</Style>
</TabControl.Resources>
</TabControl>
MyItems
是ObservableCollection
个自定义对象。
当我致电tabs.SelectedContent
时,它会返回一个项目。
我想获得MyUserControl
DataTemplate中包含的UserControl contentTemplate
。
由于mUserControl
位于模板中,因此我无法将其称为mUserControl.doSomething()
。
我尝试使用模板“FindName”功能:
ControlTemplate dt = tabs.Template;
MyUserControl mControl = (MyUserControl)dt.FindName("mUserControl", tabs);
但它返回null。
我想访问MyUserControl
对象来调用一个会改变它状态的函数(显示一个控件并隐藏另一个控件)。
当用户单击MenuItem(由MainWindow拥有)时,会发生这种情况,但受影响的窗口小部件是UserControl。
那么,我如何获得对MyUserControl
对象的引用?
答案 0 :(得分:1)
您可以从TabControl中更深入地遍历您的Visual树,您可以获得其中的所有用户控件。
您应该阅读有关视觉树或这样的答案: Find control in the visual tree