私は、インターフェイスの既存のコンシューマ(主にバインディングコントロールとなるだろう)が、追加と削除だけで表現できたものを超えて、インターフェイスの移動と置換を利用しているのだろうかと思っています。INotifyCollectionChangedのどの実装が実際に移動と置換を使用していますか?
特に:実際に使用したのですか、これは単に歴史的なアーティファクトですか?
私は、インターフェイスの既存のコンシューマ(主にバインディングコントロールとなるだろう)が、追加と削除だけで表現できたものを超えて、インターフェイスの移動と置換を利用しているのだろうかと思っています。INotifyCollectionChangedのどの実装が実際に移動と置換を使用していますか?
特に:実際に使用したのですか、これは単に歴史的なアーティファクトですか?
ObservableCollection<T>.Move(int, int)
に電話すると、移動アクションが発生します。
おそらく、アイテムを置き換えるときと同じ動作を想定できます。しかしObservableCollection
にはReplace
メソッドがありません。 index accessor instead.
これらのアクションタイプは、常にINotifyCollectionChanged
消費者によって処理される必要があります。余分な操作を防ぐヒントとして利用できます。
コレクションの高価なグラフィック表現があり、Remove
とそれに続くInsert
という名前を付けた場合を考えてみましょう。コレクションは1つの要素で縮小され、すぐに1つの要素だけ拡大します。これにより、削除されたインデックスの後にすべての要素が2回再描画される可能性があります。置換と移動は、コレクションのサイズが変更されていないことをコンシューマに知らせます。
これは確かに歴史的なアーティファクトではありません。それはあなたのためにありますので、あなたはMoveと呼ぶことができます。置換とリスナーはそれに反応することができます。それがなければ、組み込みのコントロールがそれを使用するかどうかにかかわらず、インターフェースは不完全なものになります。
ItemsControlがCollectionChangedイベントをどのように処理するかはわかりませんが、MoveイベントとReplaceイベントのロジックもいくつかあると思います。結局のところ
、WPFはオープンソースであり、なぜあなたはここでチェックしない:あなたが見ることができるようにhttp://referencesource.microsoft.com/#PresentationFramework/src/Framework/System/Windows/Data/CollectionView.cs,4270b8e1bdd07308
を、のItemsControlで使用されるCollectionViewは、1つのことを想像するイベント
moveとreplaceの両方をremoveとwithとaddで表現できるので、不完全ではありません。 – John
最初にremoveを呼び出すと、項目数が変更されたことになりますが、これは真ではありません。たとえば、ListBoxはListBoxItemを削除してから新しいものを作成する必要はありませんが、既存のListBoxItemを再利用することができます。 – Liero
@ジョン私は混乱しています。私の答えは、このコメントが表示されるまでに40分も足りないと、あなたはそれをすべて知っていると言いました。十分に明確ではないことを詳しく説明できますか? – Gusdor
をリセットし、移動に反応しますアニメーション効果に使用することができます。必要に応じて、[ソースを検索](http://referencesource.microsoft.com/#System/compmod/system/collections/specialized/notifycollectionchangedeventargs.cs,c394c49be4a151e9,references)することもできます。 –
@Damien_The_Unbelieverうわー、私は彼らがソースをオンラインで検索可能にしていたことを知らなかった。それは知って良いです。 – John
Argsコンストラクタをメモします。予想されるデータが各変更タイプとともに提供されることを確実にすることに積極的です。 – Will