2009-09-02 60 views
8

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

回答

9

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

其次,继承树型视图和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”。

+1

从2011年的SL4角度来看,我所要做的就是创建如图所示的专业化,它已经完成了绑定,所以不需要第三个,首先只是为了解释,在隐式样式中绑定到“IsExpanded”并不适用于我,并且以一个名为''的只读属性为例。 – flq 2011-08-10 14:55:12

1

yourtreeview.ExpandAll()

编辑:马丁表示,ExpandAll()方法不存在的TreeView,但是,我刚键入下面的代码在我的Silverlight项目和智能回升:

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

您还可以设置TreeView的属性IsExpanded =“真”,在XAML虽然我不知道,如果它扩展了整个树或只有一个级别

+0

'ExpandAll'不是Silverlight中'TreeView'的一种方法。 – 2009-09-02 11:07:12

+0

我在'System.Windows.Controls'程序集中引用了Silverlight 3控件'System.Windows.Controls.TreeView'。这个类没有'ExpandAll'方法。经过一番调查后,我发现Silverlight Toolkit有一个'ExpandAll'扩展方法,它可能是itellisense正在采用的方法。 – 2009-09-02 16:41:49

+0

展开全部是扩展方法,但它没有做任何事情,所以它没有帮助。对不起:( – 2009-09-02 16:42:52

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); 
     } 
    } 
    } 
+0

我想它应该工作(示例) – 2009-09-02 16:49:44

+0

我一直在所有索引TreeView.ItemContainerGenerator.ContainerFromIndex null ..不明白为什么.. – 2009-09-03 07:03:26

0

我不明白,这个问题被回答,因为树型视图始终是NULL:

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

调用UpdateLayout请( ),然后再尝试获取TreeViewItem。这应该有帮助!

+1

如果'TreeView'尚未加载您不能使用'ExpandAll',所以我猜你是在调用方法太早,为'TreeView.Loaded'事件添加一个处理程序,并在那里调用'ExpandAll'。另一个选项当然是调用'UpdateLayout',但我更喜欢另一个 – 2009-09-10 19:24:26

3

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

只需在创建树视图项后添加此行即可。 这就是全部!

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>