我有像
这样的分层数据类public class MyNode
{
public string Name { get; set;}
public bool IsExpanded { get; set;}
public List<MyNode> Nodes { get; set;}
}
我可以定义一个HierarchicalDataTemplate来将MyNode类绑定到TreeView。
<sdk:TreeView ItemsSource="{Binding RootNodes}">
<sdk:TreeView.ItemTemplate>
<sdk:HierarchicalDataTemplate ItemsSource="{Binding Nodes}">
<TextBlock Text="{Binding Name}" />
</sdk:HierarchicalDataTemplate>
</sdk:TreeView.ItemTemplate>
</sdk:TreeView>
问题是如何将TreeViewItem的IsExpanded属性数据绑定到相应的MyNode.IsExpanded属性,因此我可以保留此信息。
提前谢谢你, 莱克斯
答案 0 :(得分:4)
我不确定这是否适用于Silverlight,但在WPF中,您可以使用样式绑定到IsExpanded
:
<sdk:TreeView ItemsSource="{Binding RootNodes}">
<sdk:TreeView.Resources>
<Style TargetType="TreeViewItem">
<Setter Property="IsExpanded" Value="{Binding Path=IsExpanded, Mode=TwoWay}" />
</Style>
</sdk:TreeView.Resources>
<sdk:TreeView.ItemTemplate>
<sdk:HierarchicalDataTemplate ItemsSource="{Binding Nodes}">
<TextBlock Text="{Binding Name}" />
</sdk:HierarchicalDataTemplate>
</sdk:TreeView.ItemTemplate>
</sdk:TreeView>
答案 1 :(得分:2)
我不得不应对同样的问题而且我做了MVVM方式。
首先,您要创建一个属性,该属性将表示视图模型中是否展开了项目(主要是MVVM帮助您解决的问题)。
在您节点的视图模型中,只需添加Boolean IsNodeExpanded { get; set; }
之类的内容
警告:以上只是界面!您必须使用INotifyPropertyChanged.PropertyChanged
,通知更改,否则无效!
接下来你想把它挂钩到你的视图,这与Andy在这里建议的非常相似;使用风格。但是他的标记对我来说还不够(原因之一是它没有用)。
您真正想要做的是将样式放在树视图中ItemContainerStyle
。
<TreeView ...>
<TreeView.ItemContainerStyle>
<Style TargetType="TreeViewItem">
<Setter Property="IsExpanded" Value="{Binding Path=IsNodeExpanded, Mode=TwoWay}" />
</Style>
</TreeView.ItemContainerStyle>
</TreeView>
在我的案例中,这对我有用。
<小时/> 注意1:让自己头疼,并确保上面提到的样式中的绑定是一个双向绑定。我不久前有一个项目,当我不得不重新做这个时,我忘了把它做成双向,甚至调试都没有帮助。
注意2:你应该使用MVVM来实现这个功能,我已经尝试使用代码隐藏了,因为它看起来更短(我懒惰)而且结果很长,而且不仅仅是因为它需要一个递归函数,还因为隐藏的项目似乎不存在,直到它们的父项被打开。 这不愉快,这似乎是一种快速的方式,但我的经验使它更长。
答案 2 :(得分:1)
如果我们覆盖TreeView&amp; TreeViewItem类如下:
public class ExTreeView : System.Windows.Controls.TreeView
{
protected override DependencyObject GetContainerForItemOverride()
{
return new ExTreeViewItem();
}
}
public class ExTreeViewItem : System.Windows.Controls.TreeViewItem
{
public ExTreeViewItem()
{
SetBinding(IsExpandedProperty, new Binding("IsExpanded") { Mode = BindingMode.TwoWay });
}
protected override DependencyObject GetContainerForItemOverride()
{
return new ExTreeViewItem();
}
}
然后使用ExTreeView代替TreeView,它会自动将数据绑定到分层数据项的IsExpanded属性。