检查treeview是否包含项目

时间:2015-07-15 14:58:51

标签: c# wpf

这个问题看起来很简单。我有一个树视图,我们称之为MyTreeView,填充了所有的驱动器号,因此树视图看起来像这样:
答:\
C:\
D:\
F:\

如何检查树视图是否包含特定项目? treeview如何识别其项目? 我创建了一个MessageBox来显示MyTreeView.Items.GetItemAt(1),它将项目1标识为:
“System.Windows.Controls.TreeViewItem Header:C:\ Items.Count:1”

首先尝试最简单的事情,这显然不起作用:

if (MyTreeView.Items.Contains(@"C:\")
{
    MessageBox.Show(@"Tree contains C:\");
}

下一个最简单的事情是尝试制作一个看起来类似于我想要的TreeViewItem,这也不起作用:

TreeViewItem myItem = new TreeViewItem();
myItem.Header = @"C:\";
if (MyTreeView.Items.Contains(myItem)
{
    MessageBox.Show("Tree contains " + myItem.ToString());
}

为了确保我的基本概念正确,我尝试了一些循环逻辑,实际上确实有效:

var myItem = MyTreeView.Items.GetItemAt(1);
if (MyTreeView.Items.Contains(myItem)
{
    MessageBox.Show("Tree contains " + myItem.ToString());
}

哪个输出:
“Tree包含System.Windows.Controls.TreeViewItem标题:C:\ Items.Count:1”

我做错了什么?如何检查我的树是否包含“C:\”之类的内容?

编辑:
构建树的代码是这样的:
(基本上是来自互联网的复制和粘贴)

        foreach (string myString in Directory.GetLogicalDrives())
        {
            TreeViewItem item = new TreeViewItem();
            item.Header = myString;
            item.Tag = myString;
            item.FontWeight = FontWeights.Normal;
            item.Items.Add(dummyNode); // this is (object)dummyNode = null
            item.Expanded += new RoutedEventHandler(DWGFolder_Expanded);
            item.Selected += new RoutedEventHandler(DWGFolder_Selected);
            // the Expanded event is very similar, 
            // subitem.Header is the folder name (Testing),
            // while subitem.Tag is the full path (C:\Testing)
            MyTreeView.Items.Add(item);
        }

所以基本上我正在尝试匹配TreeViewItem对象。

2 个答案:

答案 0 :(得分:4)

我相信.Contains()会通过引用来检查值,因为它不是一个简单的字符串对象。这需要您遍历每个项目,直到您检索与标题匹配的项目。

LINQ示例

ElementCollection

答案 1 :(得分:1)

Contains在集合中查找完全相同的实例。如果您还没有要检查的对象,则无法使用Contains

但您可以使用一些基本的LINQ查询...将LINQ命名空间添加到您的类:

using System.Linq;

如果您的商品确实只是字符串,那么请使用此查询(编辑 - 但是,如果它们只是字符串,Contains 应该工作,因为它们的相等比较器的行为与常规引用类型不同,但按值比较):

if (MyTreeView.Items.Cast<string>().Any(s => s == @"C:\"))
{
    // Do stuff
}

如果你的项目是TreeViewItems,你可以使用这个:

if (MyTreeView.Items.Cast<TreeViewItem>().Any(i => i.Header.ToString() == @"C:\"))
{
    // Do stuff
}

但是您的项目可能是我们不知道的任何类,或者您的标题绑定可能会更改...如果不知道如何将项目添加到TreeView,很难为您提供最佳选择。

编辑 - 请记住,这只会在树的第一级搜索。如果您要查找的项目位于更深处,则必须进行递归搜索。那时,也许只是保持从一开始就存储的值会更好。