C# WPF在DataTemplate内将DataContext传递给my UserControl

C# WPF在DataTemplate内将DataContext传递给my UserControl,c#,wpf,C#,Wpf,我有一个带有两个ContentTemplates的TabControl: <TabControl ItemsSource="{Binding Tabs}" ContentTemplateSelector="{StaticResource TabSelector}"> <TabControl.ItemTemplate> <DataTemplate> <StackPanel>

我有一个带有两个ContentTemplates的TabControl:

<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的情况下创建,然后设置。