C# WPF在DataTemplate内将DataContext传递给my UserControl
我有一个带有两个ContentTemplates的TabControl:C# WPF在DataTemplate内将DataContext传递给my UserControl,c#,wpf,C#,Wpf,我有一个带有两个ContentTemplates的TabControl: <TabControl ItemsSource="{Binding Tabs}" ContentTemplateSelector="{StaticResource TabSelector}"> <TabControl.ItemTemplate> <DataTemplate> <StackPanel>
<TabControl ItemsSource="{Binding Tabs}" ContentTemplateSelector="{StaticResource TabSelector}">
<TabControl.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding TabName}" HorizontalAlignment="Center" />
</StackPanel>
</DataTemplate>
</TabControl.ItemTemplate>
</TabControl>
我的两个模板是两个用户控件:
<UserControl.Resources>
<ResourceDictionary>
<DataTemplate x:Key="UserListTemplate">
<uc:UserList />
</DataTemplate>
<DataTemplate x:Key="UserContentTemplate">
<uc:User />
</DataTemplate>
<uc:TabSelector x:Key="TabSelector" UserListTemplate="{StaticResource UserListTemplate}" UserContentTemplate="{StaticResource UserContentTemplate}" />
</ResourceDictionary>
</UserControl.Resources>
我正在XAML中设置DataContext:
<UserControl.DataContext>
<local:ViewUsers />
</UserControl.DataContext>
TabControl绑定正在工作,在我从集合中添加/删除时显示所有选项卡,但是如何在UserControls中获取DataContext?启动UserControl时,DataContext始终为空。模板的绑定问题是,一旦呈现为单个控件,根据控件的不同,将从其逻辑树而不是可视化树中找到其父控件的数据上下文 因此,最佳选择是通过
相对资源
直接绑定到可视父级的datacontext,例如:
{Binding TabName,
RelativeSource={RelativeSource Mode=FindAncestor,
AncestorType={x:Type TabControl }}}
或者更可能:
{Binding DataContext.TabName,
RelativeSource={RelativeSource Mode=FindAncestor,
AncestorType={x:Type TabControl }}}
在DataContextChanged事件中访问它。@FreddyFlares啊,成功了,谢谢。这很有意义,并帮助我理解了控件创建的周期,首先在没有DataContext的情况下创建,然后设置。