是的,乍一看这似乎是基本的。但问题出在这里:我正在使用MVVM和分层数据绑定来填充树。
我正在努力做的是让第一个节点扩展。原因是:
我没有对树的直接引用,因为我在视图模型代码中。 (MVVM让我疯狂)。
我实际上已经想出了如何在我的视图的xaml中使用样式来扩展所有节点,但我只是想现在扩展第一个节点而我无法弄明白。
有什么想法吗?
答案 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