ListViewItem 的组未通过另一个集合保留
Posted
技术标签:
【中文标题】ListViewItem 的组未通过另一个集合保留【英文标题】:ListViewItem's group not being preserved through another collection 【发布时间】:2012-09-10 16:59:44 【问题描述】:我正在尝试在自定义ListView
中实现搜索功能,因此我使用自定义ObservableCollection
隐藏Items
,它允许AddRange
,类似于one defined on damonpayne.com(用于tl;那里的博士基本上是在添加多个项目时抑制触发OnCollectionChanged
事件,然后使用NotifyCollectionChangedAction.Reset
触发):
public new MyCollection<ListViewItem> Items get; protected set;
MyCollection_CollectionChanged()
填充 base.Items
:
this.BeginUpdate();
base.Items.Clear();
base.Items.AddRange(this.Items.ToArray());
this.EndUpdate();
这个想法是,当项目不满足搜索条件时,它们会从base.Items
(即System.Windows.Forms.ListView)中删除,但仍保留在this.Items
(即My.Name.Space.MyListView)。当搜索被取消或条款改变时,base.Items
可以被this.Items
重新填充。
除了一个小但重要的警告之外,这可以正常工作并且符合预期:
问题是ListViewItem
s'Group
没有始终如一地从this.Items
传送到base.Items
,因此所有项目都出现在“默认”组中。
关于为什么会发生这种情况以及如何解决它的任何想法?
更新
我仍然坚持这一点。当然,.ToArray()
只是创建了Items
的浅表副本,所以应该保留Group
?
这已经被Maverik证实了:
I just called in Linqpad, and while the list reference is different, you're right.. object references are same.
更新 2
好的,经过更多调查后,我发现它发生在哪里。
将ListViewItem
s 添加到MyCollection<ListViewItem>
时:
var item0 = new ListViewItem();
var item0.Group = this.Groups["foo"];
//here this.Items.Count = 0
this.Items.Add(item0);
//here this.Items.Count = 1 with item0 having group "foo"
var item1 = new ListViewItem();
var item1.Group = this.Groups["bar"];
//here this.Items.Count = 1 with item0 having group "foo"
this.Items.Add(item1);
//here this.Items.Count = 2 with item0 having group "null" and item1 having group "bar"
我还检查了将 MyCollection<
替换为正常的 ObservableCollection<
的情况,但仍然会发生同样的情况。
更新 3 - 解决方案
请see my answer。
【问题讨论】:
啊哈,tl;dr-ers 部分 +1 【参考方案1】:背景
想通了!
我不知道为什么,但没有在应该抛出异常的时候抛出异常。
应该抛出异常Cannot add or insert the item 'item0' in more than one place.
。
(从.designer.cs
中清除了一些东西后,它被抛出了(虽然奇怪的是不是在通过时...)
根据要求,从包含自定义 ListView
的表单的设计者那里清除的代码是
this.ListView.Items.AddRange(new System.Windows.Forms.ListViewItem[]
listViewItem1,
listViewItem2,
listViewItem3,
listViewItem4,
listViewItem5,
listViewItem6);
这些只是我之前为了测试而添加的一些临时项目,但设计师一定出于某种原因记住了它们。)
解决方案
解决方案如this SO answer 中所述,我的代码现在为:
this.BeginUpdate();
base.Items.Clear();
base.Items.AddRange(this.Items.Select((ListViewItem)a => a.Clone()).ToArray());
this.EndUpdate();
【讨论】:
能否请您提一下您为了解决问题而删除的那些东西..如果它真的解决了问题,它可能会帮助其他人..以上是关于ListViewItem 的组未通过另一个集合保留的主要内容,如果未能解决你的问题,请参考以下文章