4

我有一个分层数据类,比如

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 属性,以便我可以保留此信息。

提前谢谢你,莱克斯

4

3 回答 3

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>
于 2010-07-09T15:10:51.730 回答
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,我尝试使用它的代码隐藏,因为它看起来更短(我很懒)而且结果是一团糟,不仅仅是因为它需要一个递归函数,也因为隐藏的项目似乎在其父项打开之前不存在。这并不令人愉快,而且这似乎是一种快速的方法,但我的经验使它更长。

于 2014-02-15T10:42:49.417 回答
1

如果我们像这样覆盖 TreeView 和 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 属性。

于 2010-11-25T15:44:50.927 回答