我正在尝试创建一个递归方法以取消选择WPF TreeView中的所有项目。使事情变得复杂的是,每个TreeViewItem都不是迷你TreeView。这导致您必须做很多来回转换。所以,这是我尝试过的:
TreeViewDeselectAll(myTreeView.Items);
// Must send in ItemCollection to allow the recursive call
private void TreeViewDeselectAll(ItemCollection myTreeViewItems)
{
// The only way to get to the IsSelected property is to turn it back into a TreeViewItem
foreach (TreeViewItem currentItem in myTreeViewItems)
{
currentItem.IsSelected = false;
if (currentItem.HasItems)
{
// Recursify!
TreeViewDeselectAll(currentItem.Items);
}
}
}
有没有人成功取消选择TreeView中的所有项目?您甚至能够以递归的方式遍历TreeView吗?
Winforms TreeView具有一个Nodes集合,它实际上是一个微型TreeView。这允许递归就好了。但是WPF TreeView没有节点。
在.Net 4.0中工作。
参考方案
每个TreeViewItem都是一个Mini-TreeView。您得到了错误的印象,或者您对TreeViewItems读错了。
您做错的是传递Items集合,该集合不包含TreeViewItem类型的子项,而是那些是数据项。
通过孩子们的收藏,你应该做得很好。
像这样:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private bool @switch = false;
private void TreeViewDeselectAll(IEnumerable myTreeViewItems, bool value)
{
if (myTreeViewItems != null)
{
foreach (var currentItem in myTreeViewItems)
{
if (currentItem is TreeViewItem)
{
TreeViewItem item = (TreeViewItem)currentItem;
item.IsSelected = value;
if (item.HasItems)
{
TreeViewDeselectAll(LogicalTreeHelper.GetChildren(item), value);
}
}
}
}
}
private void Button_Click(object sender, RoutedEventArgs e)
{
this.TreeViewDeselectAll(LogicalTreeHelper.GetChildren(this.treeView), this.@switch);
}
}
XAML例如如下所示:
<StackPanel>
<TreeView Name="treeView">
<TreeViewItem Header="First Level">
<TreeViewItem Header="Second Level"/>
</TreeViewItem>
</TreeView>
<Button Click="Button_Click">select/unselect all</Button>
</StackPanel>
我对TreeViewDeselectAll方法进行了一些更改。根据开关,您可以选择或取消选择全部。
将谓词<T>转换为Func <T,bool> - c#我有一个包含成员Predicate的类,希望在Linq表达式中使用该类:using System.Linq; class MyClass { public bool DoAllHaveSomeProperty() { return m_instrumentList.All(m_filterExpression); } private IEnumerable&…
WPF AvalonDock添加文档 - c#我有一个带有AvalonDock的窗口。在启动时,将打开一个文档,其中充满LocControllers用户控件(LocControllersViewModel)。现在,当双击LocController时,我想让LocController用户控件在新文档中打开。因此,第一个文档始终是概述,充满了LocController用户控件,而其他文档则在双击后添加。我已…
通过Maven编译器插件不会发生有限的包含和排除 - java我正在使用3.6.0版的maven编译器插件,在此我们只想在特定文件夹中编译一个文件,而在该位置编译所有其他文件。例如:在文件夹应用程序中有14个文件,从那我只希望编译1个文件,但它编译了所有文件,如果我要排除,则它也不起作用。 <sourceDirectory>${basedir}/../src/java</sourceDirectory…
当我所有的都是T时,如何返回Interface <T>的实例? - java我有一个界面:public interface ILoginResult<T> { public T get(); } 我有一个LoginPage对象:public class LoginPage<T> { ... public ILoginResult<T> login(...) { ... } } 我也有一些登录页面对…
客户端反序列化为数组序列化字典<string,string>数据 - c#我有一个字典,该字典使用C#中的JavaScriptSerializer进行了序列化。在客户端,我有:"{"dd049eda-e289-4ca2-8841-4908f94d5b65":"2","ab969ac2-320e-42e1-b759-038eb7f57178":"5…