Pregunta

Tengo un TreeView cuyos contenidos (TreeViewItems anidados) se generan a partir de un conjunto de datos a través de enlace de datos, que todo parece bien el trabajo. El problema que estoy corriendo en es que cuando intento y manipular el contenido de las cabeceras TreeViewItem en el código, la propiedad de cabecera devuelve el DataRowView que el TreeViewItem se generó a partir y no, como yo esperaba, el control generada por la plantilla.

Este es un ejemplo de la plantilla que estoy usando para generar los 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>

puede señalar a nadie a dónde voy mal y aconsejarme cómo acceder a las casillas de verificación de cabecera (idealmente sin ahondar en el VisualTree si es posible)?

Gracias, James

¿Fue útil?

Solución

Bueno, después de buscar he encontrado una solución adecuada al problema.

Usando el siguiente código, usted puede encontrar artículos con nombre de la plantilla:

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;
        }
} 

Además, para el beneficio de cualquier otra persona que no puede ser demasiado puesta al tanto de enlace de datos treeviews: La plantilla que he publicado en mi pregunta no es la forma correcta de la unión de un árbol. Use un HierarchicalDataTemplate para cada nivel del árbol. El contenido directo de la HierarchicalDataTemplate especificará el contenido de la cabecera de cada sub-árbol y el establecimiento de las propiedades ItemsSource y itemtemplate le permitirá unen y dar formato a los subárboles niños, por ejemplo:

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

Espero que alguien más va a encontrar esta información útil.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top