Установка условного текста в узле дерева в MVVM - PullRequest
0 голосов
/ 23 января 2019

У меня есть узел дерева с текстом, настроенным следующим образом.Свойство 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>

1 Ответ

0 голосов
/ 23 января 2019

Попытка в конце моего отредактированного вопроса была в основном там. Должно быть, у меня была какая-то опечатка или что-то еще. RelativeSource не «просачивается» к подузлам в XAML. Мне удалось вернуться к источнику объекта узла дерева по умолчанию в теге, и он работает:

<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="{Binding TitleWithDetails}" />
        </DataTrigger>
        <DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl}, Path=DataContext.ShowOrganizationTypeDetails, UpdateSourceTrigger=PropertyChanged}" Value="False">
            <Setter Property="Text" Value="{Binding Title}" />
        </DataTrigger>
    </Style.Triggers>
</Style>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...