2010-07-14 118 views
2

是的,乍一看,这似乎很基本。但问题在于:我使用MVVM和分层数据绑定来填充树。WPF/Silverlight:扩展根树节点

我很难做的是获得第一个节点扩展。原因是:

  1. 我没有直接引用树,因为我在视图模型代码中。 (MVVM正在推动我的坚果)。

  2. 我已经想出了如何通过在我的视图的xaml中使用样式来扩展所有节点,但我只想扩展现在的第一个节点,我无法弄清楚。

任何想法?

回答

4

Josh Smith在CodeProject上有一篇文章,它解释了如何在ViewModels中使用TreeView。 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

还有,如果你正在使用Silverlight,除了约什 - 史密斯的文章,你需要看看SetterValueBindingHelper在大卫Anson的博客中解释这里的差异。

3

我已经能够实现这一点的最简单方法是使用样式(您可以将所有内容保留在XAML中,并且不需要任何特殊的MVVM属性)。您可以在实际的TreeView元素上设置顶级的ItemContainerStyle,以设置根TreeViewItem的样式并将其展示为展开。然后在您的HierarchicalDataTemplate元素上设置一个ItemContainerStyle作为其他级别上所有节点的默认TreeViewItem样式。 BasedOn属性可以很容易地继承整个TreeViewItem样式,并且只更改IsExpanded属性。

主树形XAML:

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

你的基地树型视图风格:

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

根树型视图风格:

<Style x:Key="RootTreeViewItemStyle" TargetType="TreeViewItem" BasedOn="{StaticResource TreeViewItemStyle}"> 
    <Setter Property="IsExpanded" Value="True"/> 
</Style>