私はカスタムで検索機能を実装しようとしているので、 damonpayne.comで定義されているものと同様のカスタムを許可しListView
て隠しています(そこにあるtl; dr-ersの場合、基本的に追加中に発火イベントを抑制しますその後、複数のアイテムが)で起動します:Items
ObservableCollection
AddRange
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();
アイテムが検索用語を満たさない場合、アイテムは(System.Windows.Forms.ListViewなど)から削除されbase.Items
ますがthis.Items
、 (My.Name.Space.MyListViewなど)には残ります。検索がキャンセルされた場合、または用語が変更された場合は、base.Items
によって再入力できますthis.Items
。
これは正常に機能しますが、1つの小さいが重要な警告を除いて、期待どおりに機能します。
問題は、ListViewItem
s'Group
が一貫してからに運ばれておらずthis.Items
、base.Items
そのためすべてのアイテムがグループ「デフォルト」に表示されることです。
なぜこれが起こっているのか、そしてそれをどのように修正するのかについてのアイデアはありますか?
アップデート
私はまだこれに固執しています。確かにそれを行うと.ToArray()
、の浅いコピーが作成されるItems
ので、Group
保存する必要がありますか?これはMaverikによって確認されています:
アップデート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-解決策
私の答えを見てください。