2010-11-17 7 views
0

J'ai un TabControl avec ItemsSource défini sur ObservableCollection<BookTab> et en utilisant ContentTemplateSelector pour créer différents onglets.Liaison pour les contrôles de contenu de TabItem

class BookTab 
{ 
    public string Name { get; set; } 
    public string Type { get; set; } 
    public object Data { get; set; } 
} 

<TabControl Name="tabControl" 
      ContentTemplateSelector="{StaticResource tabTemplateSelector}"> 
    <TabControl.ItemContainerStyle> 
     <Style TargetType="TabItem"> 
      <Setter Property="Header" Value="{Binding Name}"/> 
      <Setter Property="Content" Value="{Binding}"/> 
     </Style> 
    </TabControl.ItemContainerStyle> 
</TabControl> 

Tapez détermine DataTemplate utilisé onglet Carnet dans l'onglet approprié, le nom est affiché sur l'en-tête de l'onglet et données doit être affiché dans le contenu de l'onglet, à savoir DataGrid. Les données sont définies sur ObservableCollections de différents types.

DataTemplate peut ressembler à ceci:

<DataTemplate x:Key="bookTabTemplate"> 
    <TabItem Name="bookTab"> 
     <Grid> 
      <DataGrid Name="bookGrid"> 
       ... 
      </DataGrid> 
     </Grid> 
    </TabItem> 
</DataTemplate> 

J'ai essayé différentes façons de lier la propriété des données à ItemsSource de DataGrid, mais tout ce que je suis arrivé est la grille affichant mot « livre » (la valeur de la propriété Nom de onglet Carnet). Ma conjecture est que je dois en quelque sorte propager la liaison de TabControl à DataGrid, mais je ne peux pas le comprendre.

Répondre

1

je le ferais comme ceci:

<TabControl SelectedItem="{Binding CurrentBook}" 
      IsSynchronizedWithCurrentItem="True" 
      ItemsSource="{Binding BookList}"> 
<TabControl.ContentTemplate> 
    <DataTemplate> 
    <Grid> 
     <ContentControl Content="{Binding Data}" 
    </Grid> 
    </DataTemplate> 
</TabControl.ContentTemplate> 
<TabControl.ItemTemplate> 
    <DataTemplate> 
    <TextBlock Text="{Binding Name}"/> 
    </DataTemplate> 
</TabControl.ItemTemplate> 
</TabControl> 

... et plus tard vous définissez dans votre app.xaml comment le contenu de présentation de vos données ...

<DataTemplate DataType="{x:Type viewmodel:bookviewmodel1}"> 
     <view:bookview1/> 
    </DataTemplate> 

Tout ce que vous A faire, crée une vue (usercontrol) pour chaque type.

HTH

0

votre contexte de données DataGrid est probablement le onglet Carnet (vous pouvez le confirmer en utilisant snoop)

Si cela est vrai, tout ce que vous devez faire est de lier le DataGrid ItemsSource à la propriété des données onglet Carnet

<DataGrid Name="bookGrid" ItemsSource="{Binding Path=Data}" /> 

Ceci devrait faire l'affaire

Questions connexes