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