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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top