Silverlight 如何将TreeViewItem.IsExpanded数据绑定到节点数据对象
我有一个分层的数据类,比如Silverlight 如何将TreeViewItem.IsExpanded数据绑定到节点数据对象,silverlight,data-binding,treeview,silverlight-toolkit,Silverlight,Data Binding,Treeview,Silverlight Toolkit,我有一个分层的数据类,比如 public class MyNode { public string Name { get; set;} public bool IsExpanded { get; set;} public List<MyNode> Nodes { get; set;} } 公共类MyNode { 公共字符串名称{get;set;} 公共布尔展开{get;set;} 公共列表节点{get;set;} } 我可以定义一个HierarchycalDa
public class MyNode
{
public string Name { get; set;}
public bool IsExpanded { get; set;}
public List<MyNode> Nodes { get; set;}
}
公共类MyNode
{
公共字符串名称{get;set;}
公共布尔展开{get;set;}
公共列表节点{get;set;}
}
我可以定义一个HierarchycalDataTemplate来将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属性,这样我就可以保留这些信息
提前谢谢大家,,
Lex我不确定这在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>
如果我们像这样重写TreeView和TreeView项目类,这是可能的:
public类ExTreeView:System.Windows.Controls.TreeView
{
受保护的覆盖依赖对象GetContainerForItemOverride()
{
返回新的ExTreeViewItem();
}
}
公共类ExTreeViewItem:System.Windows.Controls.TreeViewItem
{
公共ExTreeViewItem()
{
SetBinding(IsExpandedProperty,新绑定(“IsExpanded”){Mode=BindingMode.TwoWay});
}
受保护的覆盖依赖对象GetContainerForItemOverride()
{
返回新的ExTreeViewItem();
}
}
然后使用ExTreeView而不是TreeView,它会自动将数据绑定到分层数据项的IsExpanded属性。我不得不处理同样的问题,我采用了MVVM方法 首先,您希望创建一个属性,该属性表示该项是否在视图模型中展开(这主要是MVVM帮助您解决的问题) 在节点的视图模型中,只需添加类似于
布尔IsNodeExpanded{get;set;}
的内容即可 警告:以上只是界面!您必须使用
INotifyPropertyChanged.PropertyChanged
,通知更改,否则它将无法工作强>
接下来,你想把它和你的观点联系起来,这和安迪的建议非常相似;使用样式。然而,他的标记对我来说还不够(一个原因是它不起作用)。实际上,您要做的是将样式放置在树视图的
ItemContainerStyle
中
<TreeView ...>
<TreeView.ItemContainerStyle>
<Style TargetType="TreeViewItem">
<Setter Property="IsExpanded" Value="{Binding Path=IsNodeExpanded, Mode=TwoWay}" />
</Style>
</TreeView.ItemContainerStyle>
</TreeView>
在我的情况下,这确实对我起了作用
注1:省得自己头疼,并确保上述样式中的绑定是双向的。前一段时间我有一个项目,当我不得不重新做这个时,我忘了让它成为双向的,甚至调试也没有帮助
注2:这个函数应该使用MVVM,我曾尝试使用代码隐藏,因为它看起来比较短(我很懒),而且结果很长,不仅因为它需要一个递归函数,还因为隐藏项在父项打开之前似乎不存在这并不令人愉快,而且这似乎是一种快速的方法,但我的经验让它变得更长。这也是我的第一个猜测:)但不,它在Silverlight中不起作用。
<TreeView ...>
<TreeView.ItemContainerStyle>
<Style TargetType="TreeViewItem">
<Setter Property="IsExpanded" Value="{Binding Path=IsNodeExpanded, Mode=TwoWay}" />
</Style>
</TreeView.ItemContainerStyle>
</TreeView>