WPF / Silverlight: расширение узла корневого дерева - PullRequest
2 голосов
/ 14 июля 2010

Да, на первый взгляд это кажется базовым. Но вот проблема: я использую MVVM и иерархическую привязку данных для заполнения дерева.

Что мне трудно сделать, так это заставить первый узел расширяться. Причины:

  1. У меня нет прямой ссылки на дерево, так как я нахожусь в коде модели представления. (MVVM сводит меня с ума).

  2. Я на самом деле понял, как расширить все узлы с помощью стилей в xaml моего представления, но я просто хочу развернуть первый узел сейчас, и я не могу понять это.

Есть идеи?

Ответы [ 4 ]

4 голосов
/ 15 июля 2010

У Джоша Смита есть статья о CodeProject, в которой объясняется, как использовать TreeView с ViewModels. Упрощение WPF TreeView с помощью шаблона ViewModel

В ключевой части примера показано, как связать свойства IsExpanded и IsSelected в вашей ViewModel.

Таким образом, если все ваши ViewModel имеют свойства IsExpanded и IsSelected, вы сможете расширить определенный узел, установив для его свойства IsExpanded ViewModel значение true.

  <TreeView.ItemContainerStyle>
    <!-- 
    This Style binds a TreeViewItem to a ViewModel. 
    -->
    <Style TargetType="{x:Type TreeViewItem}">
      <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" />
      <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
      <Setter Property="FontWeight" Value="Normal" />
      <Style.Triggers>
        <Trigger Property="IsSelected" Value="True">
          <Setter Property="FontWeight" Value="Bold" />
        </Trigger>
      </Style.Triggers>
    </Style>
  </TreeView.ItemContainerStyle>
3 голосов
/ 15 июля 2010

Самый простой способ, которым я смог достичь этого, - это стили (вы можете хранить все в XAML, и вам не нужны никакие специальные свойства MVVM). Вы можете установить ItemContainerStyle верхнего уровня для фактического элемента TreeView, чтобы стилизовать корневой TreeViewItem и отображать его как развернутый. Затем установите ItemContainerStyle для вашего элемента HierarchicalDataTemplate в качестве стиля TreeViewItem по умолчанию для всех узлов на других уровнях. Атрибут BasedOn позволяет легко наследовать весь стиль TreeViewItem и изменять только свойство IsExpanded.

Основной TreeView XAML:

<TreeView x:Name="Tree" ItemContainerStyle="{StaticResource RootTreeViewItemStyle}">
    <TreeView.ItemTemplate>
        <common:HierarchicalDataTemplate ItemContainerStyle="{StaticResource TreeViewItemStyle}">
            <!-- rest of your template... -->
        </common:HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>

Ваш базовый стиль TreeViewItem:

<Style x:Key="TreeViewItemStyle" TargetType="TreeViewItem">
    <!-- your normal or default TreeViewStyle... -->
</Style>

Корневой стиль TreeViewItem:

<Style x:Key="RootTreeViewItemStyle" TargetType="TreeViewItem" BasedOn="{StaticResource TreeViewItemStyle}">
    <Setter Property="IsExpanded" Value="True"/>
</Style>
1 голос
/ 15 июля 2010

Здесь есть разница, если вы используете Silverlight, в дополнение к статье Джоша Смита вам нужно взглянуть на SetterValueBindingHelper , описанный в блоге Дэвида Ансона.

0 голосов
/ 23 июля 2018

Чтобы развернуть корневой узел, вам нужно установить ItemContainerStyle самого дерева, что означает определение стиля вне вида дерева.

<UserControl.Resources>
    <Style x:Key="RootTreeViewItemStyle" TargetType="TreeViewItem" >
        <Setter Property="IsExpanded" Value="True"/>
    </Style>
</UserControl.Resources>
<TreeView DockPanel.Dock="Left" ItemsSource="{Binding TreeViewModel}" ItemContainerStyle="{StaticResource RootTreeViewItemStyle}">
...
</TreeView>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...