2010-10-21 4 views
1

J'ai un TreeView dont le contenu (TreeViewItems imbriqué) est généré à partir d'un ensemble de données via la liaison de données, ce qui semble fonctionner correctement. Le problème que je rencontre est que lorsque j'essaie de manipuler le contenu des en-têtes TreeViewItem dans le code, la propriété Header retourne le DataRowView à partir duquel TreeViewItem a été généré et non, comme je m'y attendais, le contrôle généré par le template.WPF Valeur d'en-tête TreeViewItem après DataBinding

Voici un exemple du modèle que je utilise pour générer les TreeViewItems:

<DataTemplate x:Key="seasonTreeViewItemTemplate"> 
     <TreeViewItem> 
      <TreeViewItem.Header> 
       <CheckBox Content="{Binding Path=Row.SeasonID}" Tag="{Binding}" ToolTip="{Binding Path=Row.Title}" IsEnabled="{StaticResource seasonPermitted}" Checked="CheckBox_Checked" Unchecked="CheckBox_Unchecked" /> 
      </TreeViewItem.Header> 

      <TreeViewItem Header="Championships" ItemTemplate="{StaticResource championshipTreeViewItemTemplate}"> 
       <TreeViewItem.ItemsSource> 
        <Binding Path="Row" ConverterParameter="FK_Championship_Season"> 
         <Binding.Converter> 
          <local:RowChildrenConverter /> 
         </Binding.Converter> 
        </Binding> 
       </TreeViewItem.ItemsSource> 
      </TreeViewItem> 
     </TreeViewItem> 
    </DataTemplate> 

Quelqu'un peut-il indiquer où je vais mal et me conseiller comment accéder aux cases d'en-tête (idéalement sans entrer dans le VisualTree si possible)?

Merci, James

Répondre

1

Eh bien, après quelques recherches j'ai trouvé une solution adéquate au problème.

En utilisant le code suivant, vous trouverez des articles cités dans le modèle:

if (treeViewItem != null) 
{ 
     //Get the header content presenter. 
     ContentPresenter header = treeViewItem.Template.FindName("PART_Header", treeViewItem) as ContentPresenter; 

     if (header != null) 
     { 
      //Find a CheckBox called "checkBoxName" 
      CheckBox cb = treeViewItem.HeaderTemplate.FindName("checkBoxName", header) as CheckBox; 
     } 
} 

En outre, au profit de toute autre personne qui ne peut pas être trop clued sur arborescences de liaison de données: Le modèle que j'ai posté dans mon la question n'est pas la bonne façon de lier un treeview. Utilisez un HierarchicalDataTemplate pour chaque niveau de l'arborescence. Le contenu direct du HierarchicalDataTemplate précisera le contenu d'en-tête de chaque sous-arbre et en définissant les ItemsSource et les propriétés ItemTemplate vous permettra de lier et de formater les enfants des sous-arbres, par exemple:

<HierarchicalDataTemplate x:Key="templateName" ItemsSource="{Binding Path=someCollection}" ItemTemplate="{StaticResource someOtherTemplate}"> 
    <TextBlock Text="{Binding Path=SomeProperty}" /> 
</HierarchicalDataTemplate> 

J'espère que quelqu'un d'autre va trouver cette information utile.