繁体   English   中英

WPF将DataContext传递给DataTemplate中的UserControl

[英]WPF pass a DataContext to my UserControl inside a DataTemplate

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

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

因此,最好的办法是通过RelativeSource直接绑定绑定到可视父级的datacontext,例如:

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

或更有可能:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM