如何将TreeViewItem.IsExpanded数据绑定到节点数据对象

时间:2010-07-09 15:05:40

标签: 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;}
}

我可以定义一个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属性,因此我可以保留此信息。

提前谢谢你, 莱克斯

3 个答案:

答案 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属性。