WPF TreeViewItem Header Valore Dopo DataBinding
-
10-10-2019 - |
Domanda
Ho un TreeView il cui contenuto (TreeViewItems nidificate) sono generati da un insieme di dati tramite l'associazione dati, che tutto sembra funzionare bene. Il problema che sto funzionando in è che quando provo e manipolare il contenuto delle intestazioni TreeViewItem nel codice, le proprietà Header restituisce il DataRowView che il TreeViewItem è stato generato da e non, come mi aspettavo, il controllo generato dal modello.
Ecco un esempio del modello che sto usando per generare i 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>
Qualcuno può punto dove sto andando male e mi consigliano come accedere alle caselle di intestazione (idealmente senza scavare nel VisualTree se possibile)?
Grazie, James
Soluzione
Bene, dopo qualche ricerca ho trovato una soluzione adeguata al problema.
utilizzando il seguente codice, è possibile trovare denominati elementi nel template:
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;
}
}
Inoltre, a beneficio di chiunque altro che non possono essere troppo chiarirmi su associazione dati treeviews: Il modello che ho postato nella mia interrogazione non è il modo giusto per andare su associazione di un albero. Utilizzare un HierarchicalDataTemplate per ogni livello dell'albero. Il contenuto diretto del HierarchicalDataTemplate specificherà il contenuto intestazione di ogni sottostruttura e l'impostazione delle proprietà ItemsSource e ItemTemplate vi permetterà di legare e formattare le sottostrutture bambini, per esempio:
<HierarchicalDataTemplate x:Key="templateName" ItemsSource="{Binding Path=someCollection}" ItemTemplate="{StaticResource someOtherTemplate}">
<TextBlock Text="{Binding Path=SomeProperty}" />
</HierarchicalDataTemplate>
Spero che qualcun altro troverà queste informazioni utili.