WPF将DataContext传递给DataTemplate中的UserControl

时间:2015-05-10 01:07:50

标签: c# wpf

我有一个包含两个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始终为null。

1 个答案:

答案 0 :(得分:3)

模板的绑定问题是,一旦呈现为单独控件,取决于控件找到其父数据上下文,而不是来自可视树而是来自其逻辑树。

所以最好的办法是通过RelativeSource直接绑定绑定到可视父亲的datacontext,例如:

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

或更有可能:

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