WPF/Silverlight:展开根树节点

wsxa1bj1  于 2023-01-18  发布在  其他
关注(0)|答案(4)|浏览(166)

是的,乍一看这似乎很简单。但问题是:我使用MVVM和分层数据绑定来填充树。
我很难做到的是让第一个节点展开,原因是:
1.我没有对树的直接引用,因为我在视图模型代码中(MVVM快把我逼疯了)。
1.实际上,我已经知道如何使用视图的xaml中的Styles展开所有节点,但现在我只想展开第一个节点,但我不知道该怎么做。
有什么想法吗?

mqkwyuun

mqkwyuun1#

我能做到这一点的最简单的方法是使用样式(您可以将所有内容保留在XAML中,并且不需要任何特殊的MVVM属性)。您可以在实际TreeView元素上设置顶级ItemContainerStyle,以设置根TreeViewItem的样式并将其显示为展开的。然后,将HierarchicalDataTemplate元素上的ItemContainerStyle设置为其他级别上所有节点的默认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>
zz2j4svz

zz2j4svz2#

Josh Smith有一篇关于CodeProject的文章,其中解释了如何将TreeView与ViewModels一起使用。Simplifying the WPF TreeView by Using the ViewModel Pattern
该示例的关键部分显示了如何在ViewModel中绑定IsExpanded和IsSelected属性。
因此,如果所有ViewModel都具有IsExpanded和IsSelected属性,则可以通过将ViewModel的IsExpanded属性设置为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>
bweufnob

bweufnob3#

如果你使用Silverlight,这里有一个区别,除了Josh Smith的文章,你还需要看看大卫安森的博客中解释的SetterValueBindingHelper

lrl1mhuk

lrl1mhuk4#

要展开根节点,需要设置树视图本身的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>

相关问题