2015-05-10 62 views
1

裏面我有兩個ContentTemplates一個TabControl:WPF通過一個DataContext到我的用戶一個DataTemplate

<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>   

我設置的DataContext在XAML中:

<UserControl.DataContext> 
    <local:ViewUsers /> 
</UserControl.DataContext> 

TabControl綁定正在工作,顯示所有選項卡,因爲我添加/從t中刪除他的集合,但我如何在我的UserControls中獲得DataContext?當用戶控件啓動時,DataContext始終爲空。

+1

訪問它在DataContextChanged僅事件

所以最好的辦法是通過RelativeSource直接結合,如綁定到視覺父母的datacontext 。 – FreddyFlares

+0

@FreddyFlares嗯,工作,謝謝。它是有道理的,並幫助我理解控制創建的循環,首先創建沒有DataContext,然後它被設置。 – Danicco

回答

2

模板的綁定問題是,一旦呈現爲單個控件,將根據控件找到其父級的數據上下文,而不是從可視化樹中,而是從其邏輯樹中查找其父級的數據上下文。

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

或更可能:

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