在我的WPF窗口中,我有一个包含3列的列表视图(lvw1)。在添加新的列表视图项时,我想检查项是否已经存在。我正在使用以下代码行
if (!lvw1.Items.Containskey(keyitem))
Keyitem 是与现有项目交叉检查的字符串。我猜 Containskey 方法在wpf中不起作用。
请建议替代/适当的代码。
答案 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
。
这是有效的,因为ItemCollection
(Items
)Contains
方法的类型在内部使用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;
}