如何在添加现有WPF ListView时根除重复项目

时间:2015-10-09 13:15:06

标签: wpf listview

在我的WPF窗口中,我有一个包含3列的列表视图(lvw1)。在添加新的列表视图项时,我想检查项是否已经存在。我正在使用以下代码行

if (!lvw1.Items.Containskey(keyitem))

Keyitem 是与现有项目交叉检查的字符串。我猜 Containskey 方法在wpf中不起作用。

请建议替代/适当的代码。

4 个答案:

答案 0 :(得分:1)

您可以使用Contains()方法,只需将您要创建的新对象分配给变量,并检查它是否已存在于ListView中:

var newObject = new { Col1 = txt1.Text, Col2 = txt2.Text, Col3 = txt3.Text };
if(!lvw1.Items.Contains(newObject)){
    lvw1.Items.Add(newObject);
}

更新以使其忽略大小写:
可能最简单的方法是为您的类型创建class并覆盖Equals
这是有效的,因为ItemCollectionItemsContains方法的类型在内部使用Equals方法来检查包含对象的相等性。

public class Item
{
    public string Text1 { get; set; }
    public string Text2 { get; set; }
    public string Text3 { get; set; }

    public Item(string text1, string text2, string text3)
    {
        this.Text1 = text1;
        this.Text2 = text2;
        this.Text3 = text3;
    }

    public override bool Equals(object obj)
    {
        var compareObject = obj as Item;
        if (compareObject == null) return false;
        return Text1.ToLower().Equals(compareObject.Text1.ToLower()) &&
            Text2.ToLower().Equals(compareObject.Text2.ToLower()) &&
            Text3.ToLower().Equals(compareObject.Text3.ToLower());
    }
}

然后,不是创建anonymous object,而是创建此类型的实例。

var newObject = new Item(txt1.Text, txt2.Text, txt3.Text); //use new Item() here
if(!lvw1.Items.Contains(newObject)){
    lvw1.Items.Add(newObject);
}

答案 1 :(得分:0)

您可以按文字找到该项目:

ListViewItem item = lvw1.FindItemWithText("item text");
if (item == null)
{
    // does not exist. add to list
}

答案 2 :(得分:0)

您可以像这样使用ItemCollection.IndexOf Method

if (lvw1.Items.IndexOf(keyitem) < 0)
{
    // add the object
}

注意这将隐含地使用keyitem对象的Equals方法,无论如何。如果不行,那么您必须枚举整个集合(例如使用Linq方法)以满足您的需求。

答案 3 :(得分:0)

试试这个

using System.Linq;

...
object o = new { Col1 = txt1.Text, Col2 = txt2.Text, Col3 = txt3.Text });
if (!lvw1.Items.Cast<dynamic>().Any(d => IsEqual(d, o))) {
    // add item
}
...

private static bool IsEqual(dynamic a, dynamic b) {
    return a.Col1 == b.Col1 && a.Col2 == b.Col2 && a.Col3 == b.Col3;
}