在Silverlight中展开整个TreeView
如何在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?
首先,阅读这篇文章: 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”。
yourtreeview.ExpandAll()
编辑:马丁表示,ExpandAll()方法不存在的TreeView,但是,我刚键入下面的代码在我的Silverlight项目和智能回升:
TreeView test = new TreeView();
test.ExpandAll();
您还可以设置TreeView的属性IsExpanded =“真”,在XAML虽然我不知道,如果它扩展了整个树或只有一个级别
'ExpandAll'不是Silverlight中'TreeView'的一种方法。 – 2009-09-02 11:07:12
我在'System.Windows.Controls'程序集中引用了Silverlight 3控件'System.Windows.Controls.TreeView'。这个类没有'ExpandAll'方法。经过一番调查后,我发现Silverlight Toolkit有一个'ExpandAll'扩展方法,它可能是itellisense正在采用的方法。 – 2009-09-02 16:41:49
展开全部是扩展方法,但它没有做任何事情,所以它没有帮助。对不起:( – 2009-09-02 16:42:52
你将不得不使用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);
}
}
}
我想它应该工作(示例) – 2009-09-02 16:49:44
我一直在所有索引TreeView.ItemContainerGenerator.ContainerFromIndex null ..不明白为什么.. – 2009-09-03 07:03:26
我不明白,这个问题被回答,因为树型视图始终是NULL:
TreeViewItem item = treeView.ItemContainerGenerator.ContainerFromIndex(i) as TreeViewItem;
if (item != null)
ExpandAll(item);
调用UpdateLayout请( ),然后再尝试获取TreeViewItem。这应该有帮助!
如果'TreeView'尚未加载您不能使用'ExpandAll',所以我猜你是在调用方法太早,为'TreeView.Loaded'事件添加一个处理程序,并在那里调用'ExpandAll'。另一个选项当然是调用'UpdateLayout',但我更喜欢另一个 – 2009-09-10 19:24:26
TreeViewMenu.Dispatcher.BeginInvoke(()=> TreeViewMenu.ExpandAll());
只需在创建树视图项后添加此行即可。 这就是全部!
我知道这是有点晚了,但我发现这个寻找答案的时候,并自发现在Silverlight 4中,您可以使用隐式主题化要做到这一点:
<Style TargetType="controls:TreeViewItem">
<Setter Property="IsExpanded" Value="True" />
</Style>
在Silverlight 5,你将有将此代码添加到该部分以实现此目的。
<Style TargetType="sdk:TreeViewItem">
<Setter Property="IsExpanded" Value="True" />
</Style>
从2011年的SL4角度来看,我所要做的就是创建如图所示的专业化,它已经完成了绑定,所以不需要第三个,首先只是为了解释,在隐式样式中绑定到“IsExpanded”并不适用于我,并且以一个名为''的只读属性为例。 – flq 2011-08-10 14:55:12