WPF / Silverlight:扩展根树节点

时间:2010-07-14 19:55:25

标签: c# wpf silverlight xaml

是的,乍一看这似乎是基本的。但问题出在这里:我正在使用MVVM和分层数据绑定来填充树。

我正在努力做的是让第一个节点扩展。原因是:

  1. 我没有对树的直接引用,因为我在视图模型代码中。 (MVVM让我疯狂)。

  2. 我实际上已经想出了如何在我的视图的xaml中使用样式来扩展所有节点,但我只是想现在扩展第一个节点而我无法弄明白。

  3. 有什么想法吗?

4 个答案:

答案 0 :(得分:4)

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>

答案 1 :(得分:3)

我能够实现这一目标的最简单方法是使用样式(您可以将所有内容保存在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>

答案 2 :(得分:1)

如果您使用的是Silverlight,那么除了Josh Smith的文章之外,您还需要查看David Anson博客中解释的SetterValueBindingHelper

答案 3 :(得分:0)

要扩展根节点,您需要设置树视图项目本身的ItemContainerStyle,这意味着在树视图之外定义样式。

ng build --prod