【问题标题】:Expand whole TreeView in Silverlight在 Silverlight 中展开整个 TreeView
【发布时间】:2009-09-02 08:19:34
【问题描述】:

如何在 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?

【问题讨论】:

    标签: silverlight treeview


    【解决方案1】:

    我知道这有点晚了,但我在寻找答案时发现了这一点,并且发现在 Silverlight 4 中您可以使用隐式主题来执行此操作:

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

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

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

    【讨论】:

      【解决方案2】:

      首先,阅读这篇文章: 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;
          }
      }
      

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

      【讨论】:

      • 从 2011 SL4 的角度来看,我必须做的是创建如图所示的专业化。它已经完成了绑定,因此不需要第三个。首先只是为了解释。以隐式样式绑定到“IsExpanded”对我不起作用,并且在名为 '' 的只读属性的例外情况下退出。去图...
      【解决方案3】:

      您必须使用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);
            }
          }
        }
      

      【讨论】:

      • 我在所有索引上的 TreeView.ItemContainerGenerator.ContainerFromIndex 上一直为空..不明白为什么..
      【解决方案4】:

      TreeViewMenu.Dispatcher.BeginInvoke(() => TreeViewMenu.ExpandAll());

      只需在创建树视图项目后添加此行。 就是这样!

      【讨论】:

        【解决方案5】:

        yourtreeview.ExpandAll()

        编辑:Martin 指出 TreeView 不存在 ExpandAll() 方法,但是,我只是在 Silverlight 项目中键入以下代码,然后智能感知被拾取:

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

        您还可以在 XAML 中设置 TreeView 属性 IsExpanded = "true",尽管我不确定这是否会扩展整个树或仅扩展一层

        【讨论】:

        • ExpandAll 不是 Silverlight 中 TreeView 上的方法。
        • 我指的是 System.Windows.Controls 程序集中的 Silverlight 3 控件 System.Windows.Controls.TreeView。此类没有ExpandAll 方法。经过一番调查,我发现 Silverlight 工具包有一个 ExpandAll 扩展方法,这可能是 itellisense 正在使用的方法。
        • Expand all 是一种扩展方法,但它没有做任何事情,所以没有帮助。对不起:(
        【解决方案6】:

        我没有看到问题得到了回答,因为 TreeViewItem 始终为 NULL:

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

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

        【讨论】:

        • 如果TreeView 尚未加载,您将无法使用ExpandAll,所以我猜您调用该方法为时过早。为TreeView.Loaded 事件添加一个处理程序并在那里调用ExpandAll。另一种选择当然是致电UpdateLayout,但我更喜欢另一种方法。
        【解决方案7】:

        如果您希望在 Xaml 中进行操作,可以使用 silverlight 工具包主题程序集和设置样式资源来完成。 代码可在此处获得: http://bea.stollnitz.com/blog/?p=54

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-11-22
          • 2013-11-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多