在Silverlight中展开整个TreeView

时间:2009-09-02 08:19:35

标签: silverlight treeview

如何在Silverlight中扩展整个TreeView?

编辑:这是XAML:

<controls:TreeView x:Name="tv">
    <controls:TreeView.ItemTemplate>
        <common:HierarchicalDataTemplate ItemsSource="{Binding Children}">
            <CheckBox IsChecked="{Binding Visible, Mode=TwoWay}" Content="{Binding Name}"/>
        </common:HierarchicalDataTemplate>
    </controls:TreeView.ItemTemplate>
</controls:TreeView>

使用ItemTemplate可能会使ItemContainerGenerator.ContainerFromIndex在任何索引上返回null?

7 个答案:

答案 0 :(得分:18)

我知道这有点晚了但我在寻找答案时发现了这一点,并且发现在Silverlight 4中你可以使用隐式主题来做到这一点:

<Style TargetType="controls:TreeViewItem">
    <Setter Property="IsExpanded" Value="True" />
</Style>

在Silverlight 5中,您必须将此代码添加到该部分才能实现此目的。

<Style TargetType="sdk:TreeViewItem">
    <Setter Property="IsExpanded" Value="True" />
</Style>

答案 1 :(得分:9)

首先,阅读这篇文章: http://bea.stollnitz.com/blog/?p=55

其次,继承TreeViewItem和TreeView:

public class TreeViewItemEx : TreeViewItem {
    protected override DependencyObject GetContainerForItemOverride() {
        TreeViewItemEx tvi = new TreeViewItemEx();
        Binding expandedBinding = new Binding("IsExpanded");
        expandedBinding.Mode = BindingMode.TwoWay;
        tvi.SetBinding(TreeViewItemEx.IsExpandedProperty, expandedBinding);
        return tvi;
    }
}

public class TreeViewEx : TreeView {
    protected override DependencyObject GetContainerForItemOverride() {
        TreeViewItemEx tvi = new TreeViewItemEx();
        Binding expandedBinding = new Binding("IsExpanded");
        expandedBinding.Mode = BindingMode.TwoWay;
        tvi.SetBinding(TreeViewItemEx.IsExpandedProperty, expandedBinding);

        return tvi;
    }
}

第三,将Model的属性绑定到“IsExpanded”。

答案 2 :(得分:4)

您必须使用TreeView.ItemContainerGenerator获取TreeViewItem个实例并在其中设置IsExpanded。这是稍微复杂的,因为扩展是异步执行的。您可以在互联网上找到代码示例,或者只使用此扩展方法:

public static class TreeViewExtensions {

  public static void ExpandAll(this TreeView treeView) {
    for (Int32 i = 0; i < treeView.Items.Count; ++i) {
      TreeViewItem item = treeView.ItemContainerGenerator.ContainerFromIndex(i) as TreeViewItem;
      if (item != null)
        ExpandAll(item);
    }
  }

  static void ExpandAll(TreeViewItem item) {
    if (!item.IsExpanded) {
      item.IsExpanded = true;
      item.Dispatcher.BeginInvoke(() => ExpandAll(item));
    }
    else {
      for (Int32 i = 0; i < item.Items.Count; ++i) {
        TreeViewItem childItem = item.ItemContainerGenerator.ContainerFromIndex(i) as TreeViewItem;
        if (childItem != null)
          ExpandAll(childItem);
      }
    }
  }

答案 3 :(得分:3)

TreeViewMenu.Dispatcher.BeginInvoke(()=&gt; TreeViewMenu.ExpandAll());

创建树视图项后,只需添加此行。 多数民众赞成!

答案 4 :(得分:1)

yourtreeview.ExpandAll()

编辑:Martin表示TreeView不存在ExpandAll()方法,但是,我只是在我的Silverlight项目中键入以下代码并且智能感知得到了:

TreeView test = new TreeView();
            test.ExpandAll();

你也可以在XAML中设置TreeView属性IsExpanded =“true”,虽然我不确定是扩展整个树还是仅扩展一个级别

答案 5 :(得分:0)

我没有看到问题得到解答,因为TreeViewItem总是为NULL:

TreeViewItem item = treeView.ItemContainerGenerator.ContainerFromIndex(i) as TreeViewItem;
      if (item != null)
        ExpandAll(item);

在尝试获取TreeViewItem之前,在TreeView上调用UpdateLayout()。那应该有帮助!

答案 6 :(得分:0)

如果您希望在Xaml中进行,可以使用silverlight toolkit主题组件和&amp ;;设置样式资源。 代码可在此处获得: http://bea.stollnitz.com/blog/?p=54