WPF如何在DataTemplate中向UserControl传递DataContext?

4

我有一个带有两个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>
绑定已经生效,随着从集合中添加/删除选项卡,所有选项卡都被显示。但是,我如何在我的用户控件(UserControls)中获取DataContext?当用户控件启动时,DataContext始终为null。

1
在 DataContextChanged 事件中访问它。 - FreddyFlares
@FreddyFlares 哦,好的,谢谢。这很有道理,帮助我理解了控件创建的周期,首先它是没有DataContext创建的,然后再设置。 - Danicco
1个回答

3

模板的绑定问题在于,一旦作为单独控件呈现,取决于控件,它会从逻辑树中查找其父级数据上下文,而不是从可视树中查找。

因此,最好通过RelativeSource直接绑定到可视父级的数据上下文,例如:

{Binding TabName, 
         RelativeSource={RelativeSource Mode=FindAncestor, 
            AncestorType={x:Type TabControl }}}

更可能的是:
   {Binding DataContext.TabName, 
             RelativeSource={RelativeSource Mode=FindAncestor, 
                AncestorType={x:Type TabControl }}}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接