我目前需要自定义ListViewItem
课程 - 让我们称之为MyListViewItem
。它需要有一些与每个项目关联的附加数据,并在更改Checked属性时执行一些操作。我已经尝试了几件事,但目前相关代码看起来像这样:
class MyListViewItem : ListViewItem {
new public bool Checked {
get {
return base.Checked;
}
set {
base.Checked = value;
// do some other things here based on value
}
}
public MyListViewItem(Object otherData) {
// ...
}
}
我遇到的问题是当我点击ListView中的项目复选框时,我的setter永远不会被调用。有谁知道我做错了什么?我知道我可以使用父ListView的ItemChecked事件,但这似乎是一个不那么干净的解决方案。 (另外我实际上并没有将Object传递给构造函数,但这部分并不重要。)
答案 0 :(得分:18)
它不起作用,因为“new”关键字不会仅仅“隐藏”它来覆盖它。
这意味着如果您通过MyListViewItem的类型定义调用对象实例上的Checked,则将运行您的代码。但是,ListView通过ListViewItem的类型定义引用此对象,因此不会调用您的“新”方法。
“new”是不覆盖。更好的解决方案是可能在自定义列表视图中处理代码。它真的不那么难看。
答案 1 :(得分:9)
new
不override
成员base
。它声明了一个具有相同名称的新方法。在VB.NET中,它被称为Shadows
。
实际上,new
除了关闭编译器警告外什么都不做。您未声明为override
的成员(并且只有base
成员为virtual
或override
时才能执行此操作)将与继承树完全无关base
成员。
答案 2 :(得分:3)
假设ListViewItem
。Checked
属性是虚拟的,您需要覆盖它:
public override bool Checked
答案 3 :(得分:1)
ListViewItem.Checked属性不是虚拟的(请参阅MSDN doc here),因此您将无法以这种方式覆盖它的行为。您必须使用该事件或从ListView派生并覆盖ListView.OnItemChecked以更改行为。
答案 4 :(得分:1)
为什么不创建一个单独的类型来包含自定义数据,然后为每个ListViewItem Tag属性分配一个对自定义数据的引用,而不是创建自己的自定义ListViewItem?
这是我一直使用的模式,它运作良好。对于选中项目时的自定义操作,只需处理列表视图中的相关事件。