是的,乍一看,這似乎很基本。但問題在於:我使用MVVM和分層數據綁定來填充樹。WPF/Silverlight:擴展根樹節點
我很難做的是獲得第一個節點擴展。原因是:
我沒有直接引用樹,因爲我在視圖模型代碼中。 (MVVM正在推動我的堅果)。
我已經想出瞭如何通過在我的視圖的xaml中使用樣式來擴展所有節點,但我只想擴展現在的第一個節點,我無法弄清楚。
任何想法?
是的,乍一看,這似乎很基本。但問題在於:我使用MVVM和分層數據綁定來填充樹。WPF/Silverlight:擴展根樹節點
我很難做的是獲得第一個節點擴展。原因是:
我沒有直接引用樹,因爲我在視圖模型代碼中。 (MVVM正在推動我的堅果)。
我已經想出瞭如何通過在我的視圖的xaml中使用樣式來擴展所有節點,但我只想擴展現在的第一個節點,我無法弄清楚。
任何想法?
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>
還有,如果你正在使用Silverlight,除了約什 - 史密斯的文章,你需要看看SetterValueBindingHelper在大衛Anson的博客中解釋這裏的差異。
我已經能夠實現這一點的最簡單方法是使用樣式(您可以將所有內容保留在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>