2010-07-14 85 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>