WPF TreeviewItem Значение заголовка после присмотра
-
10-10-2019 - |
Вопрос
У меня есть TreeView, содержание которого (вложенные TreeViewitems) генерируются из набора данных через DATANDINGING, которые все кажется, работают нормально. Проблема, в которой я работаю, это то, что когда я пытаюсь манипулировать содержимым заголовков TreeViewItem в коде, свойство заголовка возвращает 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, если это возможно)?
Спасибо, Джеймс
Решение
Ну, после некоторых поисков я нашел адекватное решение проблемы.
Используя следующий код, вы можете найти именованные элементы в шаблоне:
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;
}
}
Кроме того, в интересах кого-либо еще, кто не может быть слишком выяснен на Data Danternding TreeViews: шаблон, который я разместил в моем вопросе, не является правильным способом перейти к привязке TreeView. Используйте иерархический расклад для каждого уровня дерева. Прямое содержание иерархическогоdataTemplate будет указывать содержимое заголовка каждого поддерева, и настройка свойств Itemsource и ItemTemplate позволят вам привязывать и форматировать субтреевые дети, например:
<HierarchicalDataTemplate x:Key="templateName" ItemsSource="{Binding Path=someCollection}" ItemTemplate="{StaticResource someOtherTemplate}">
<TextBlock Text="{Binding Path=SomeProperty}" />
</HierarchicalDataTemplate>
Я надеюсь, что кто-то еще найдет эту информацию полезной.