У меня есть узел дерева с текстом, настроенным следующим образом.Свойство Title
- это свойство в моем пользовательском классе, которое представляет узел дерева.Моя ViewModel хранит ObservableCollection этих элементов.
Я бы хотел связать с другим свойством, отличным от Title, при некоторых условиях.Условие будет основано на логическом свойстве в моем содержащем ViewModel, а не на пользовательском объекте представления treenode.
<TreeView Name="OrganizationTree" SelectedItemChanged="OrganizationTree_OnSelectedItemChanged" ItemsSource="{Binding OrganizationTreeNodes}"
ItemContainerStyle="{StaticResource ExpansionAndSelectionManagementStyle}">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Children}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Title}" Style="{StaticResource NodeFontStyle}"/>
</StackPanel>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
Мне известно об использовании триггеров стилей для стилизации дерева по-разному.Но триггеры стиля, похоже, отключают только свойство в объекте дерева, а не ViewModel.Это имеет смысл, так как вы делаете что-то для каждого узла.
Возможно ли иметь триггер или какой-либо другой механизм для изменения текста узла дерева?
Например:
if (viewModel.IsShowingExtraData)
{
// use CustomTreeNodeObject's TitleAndExtra property
}
else
{
// use CustomTreeNodeObject's Title property
}
Что я пробовал:
Я создал новый стиль и применил его к TextBlock.Я настроил поиск предков для доступа к свойству виртуальной машины.Это работает, но я хочу, чтобы свойство setter использовало свойство в узле дерева.Я не уверен, как "найти потомков" на этом этапе, вместо того, чтобы придерживаться в контексте данных родителя.
<Style x:Key="NodeTextConditionStyle" TargetType="TextBlock">
<Setter Property="Text" Value="??"/>
<Style.Triggers>
<!-- note: the binding path is relative to an OrganizationTreeNode, not the view model. So need to do some relative ancestor trickery -->
<DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl}, Path=DataContext.ShowOrganizationTypeDetails, UpdateSourceTrigger=PropertyChanged}" Value="True">
<Setter Property="Text" Value="?? how to get descendant prop?"/>
</DataTrigger>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl}, Path=DataContext.ShowOrganizationTypeDetails, UpdateSourceTrigger=PropertyChanged}" Value="False">
<Setter Property="Text" Value="?? how to get descendant prop?" />
</DataTrigger>
</Style.Triggers>
</Style>