2010-06-14 5 views
1

Je rencontre des problèmes en essayant de générer dynamiquement du contenu dans WPF et après avoir lié des données.DataTemplates de liaison (ou une autre approche)

J'ai le scénario suivant: TabControl - TabItems générés par DataTemplate Dynamiquement - à l'intérieur TabItems, j'ai du contenu dynamique généré par DataTemplate que je veux lier (ListBox).

Le code suivant:

:: TabControl

<TabControl Height="252" HorizontalAlignment="Left" Name="tabControl1" VerticalAlignment="Top" Width="458" Margin="12,12,12,12" ContentTemplate="{StaticResource tabItemContent}"></TabControl> 

:: Le modèle pour TabControl générer TabItems

<DataTemplate x:Key="tabItemContent"> 
     <Grid> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="*" /> 
      </Grid.ColumnDefinitions> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="*" /> 
      </Grid.RowDefinitions> 
      <ListBox ItemTemplate="{StaticResource listBoxContent}" ItemsSource="{Binding}"> 
      </ListBox> 
     </Grid> 
    </DataTemplate> 

:: Le modèle pour ListBox l'intérieur de chaque TabItem

<DataTemplate x:Key="listBoxContent"> 
     <Grid> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="22"/> 
       <ColumnDefinition Width="*" /> 
      </Grid.ColumnDefinitions> 
      <Image Grid.Column="0" Source="{Binding Path=PluginIcon}" /> 
      <TextBlock Grid.Column="1" Text="{Binding Path=Text}" /> 
     </Grid>   
    </DataTemplate> 

Donc, lorsque je tente de le faire sur le code dans une boucle pour créer les TabItems:

TabItem tabitem = tabControl1.Items[catIndex] as TabItem; 
    tabitem.DataContext = plugins.ToList(); 

où « plugins » est un Enumerable

Le ListBox n'est pas limitée. J'ai également essayé de trouver le ListBox dans TabItem pour définir la propriété ItemSource mais pas de succès du tout.

Quelqu'un a une idée sur la façon de faire cela? Merci d'avance.

Répondre

0

Le modèle pour TabControl utilise un ContentPresenter pour la présente SelectedContent, comme ceci:

<ContentPresenter Content="{TemplateBinding SelectedContent}" 
        ContentTemplate="{TemplateBinding ContentTemplate}" /> 

Un travail de ContentPresenter dans la vie est de développer un DataTemplate. Dans ce cas, il définit le DataContext de l'arbre visuel construit sur sa propriété Content, qui dans ce cas est liée à SelectedContent.

Le contenu SelectedContent est défini à partir de la propriété Content de TabItem, et non son DataContext. Ainsi, la définition de DataContext sur TabItem ne définit pas DataContext dans l'arborescence visuelle de la zone de contenu.

Qu'est-ce que vous voulez est:

tabItem.Content = plugins.ToList(); 
+0

Merci beaucoup Ray. Ça a marché! –

Questions connexes