Question

J'ai un TreeView dont le contenu (TreeViewItems imbriqués) sont générés à partir d'un ensemble de données via la liaison de données, qui tout semble fonctionner très bien. La question que je suis en cours d'exécution en est que quand je tente de manipuler le contenu des en-têtes de TreeViewItem dans le code, les déclarations de propriété en-tête La DataRowView que le TreeViewItem a été généré à partir et non pas, comme je l'attendais, le contrôle généré par le modèle.

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>

point Quelqu'un peut-il 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

Était-ce utile?

La solution

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

En utilisant le code suivant, vous trouverez les éléments nommé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 databinding arborescences: Le modèle que j'ai posté dans ma question n'est pas la bonne façon de s'y prendre pour se lier à une vue arborescente. Utilisez un HierarchicalDataTemplate pour chaque niveau de l'arbre. Le contenu direct du HierarchicalDataTemplate précisera le contenu d'en-tête de chaque sous-arbre et définissant les propriétés ItemsSource et 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top