Значение заголовка WPF TreeViewItem после привязки данных - PullRequest
1 голос
/ 21 октября 2010

У меня есть TreeView, содержимое которого (вложенные TreeViewItems) генерируется из набора данных посредством привязки данных, что, кажется, все работает нормально.Проблема, с которой я сталкиваюсь, заключается в том, что когда я пытаюсь манипулировать содержимым заголовков TreeViewItem в коде, свойство Header возвращает DataRowView, из которого был создан TreeViewItem, а не, как я ожидал, элемент управления, сгенерированный шаблоном.

Вот пример шаблона, который я использую для создания 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>

Может кто-нибудь указать, где я иду не так, и посоветовать мне, как получить доступ к флажкам заголовка (в идеале, не углубляясь в VisualTree, если это возможно)?

Спасибо, Джеймс

1 Ответ

1 голос
/ 25 октября 2010

Что ж, после некоторых поисков я нашел адекватное решение проблемы.

Используя следующий код, вы можете найти именованные элементы в шаблоне:

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

Кроме того, для всех, кто не слишком осведомлен о древовидных привязках к данным: шаблон, который я разместил в своем вопросе, не является правильным способом привязки древовидного представления. Используйте HierarchicalDataTemplate для каждого уровня дерева. Прямое содержимое HierarchicalDataTemplate будет определять содержимое заголовка каждого поддерева, а установка свойств ItemsSource и ItemTemplate позволит вам связывать и форматировать дочерние поддеревья, например:

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

Я надеюсь, что кто-то найдет эту информацию полезной.

...