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 重新填充。

除了一个小但重要的警告之外,这可以正常工作并且符合预期:

问题是ListViewItems'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

好的,经过更多调查后,我发现它发生在哪里。

ListViewItems 添加到MyCollection&lt;ListViewItem&gt; 时:

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&lt; 替换为正常的 ObservableCollection&lt; 的情况,但仍然会发生同样的情况。

更新 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 的组未通过另一个集合保留的主要内容,如果未能解决你的问题,请参考以下文章

从查询到子查询的组中未选择的值

ListView

域管理员组未通过 LDAP 显示

是否可以将集合视图保留在另一个集合视图中?

ListViewItem 选中与选中

如何在 SWIFT 中更改 ViewController 后保留集合视图滚动位置