1

を使用する MVVM ベースの WPF アプリに取り組んでいますDataGridObservableCollection<Widget>グリッドは(Widgetリスト)にデータ バインドされています。Widgetユーザーは、現在選択されている の下のリストにを挿入したり、選択Widgetした を削除したり、グリッドでWidgetを並べ替えたりできる必要があります。Widgetドラッグ アンド ドロップで並べ替えを実装します。

これを掘り下げる前に、私のアプローチの現実を確認したいと思います。これが私がやろうとしていることです:WidgetクラスにはIndex、リストの順序付けに使用されるプロパティがありWidgetます。追加、削除、および並べ替えは、この Index プロパティを操作することによって行われ、並べ替えWidgetCollectionView.

DataContextが設定される前に、WidgetリストはIndexプロパティでソートされます。ユーザーが を追加するWidgetと、プロパティはグリッドで選択された項目の下Indexごとに 1 ずつ増加し、新しい項目には再番号付けによって開かれたインデックス番号が与えられます。リストが再ソートされ、バインディングが更新されます。WidgetWidgetWidget

ユーザーが を削除するWidgetと、WidgetがリストからIndex削除され、削除されたアイテムの下にあるグリッド上のアイテムのプロパティが 1 減りますWidget。上記のように、リストが再ソートされ、バインディングが更新されます。並べ替えは、削除と挿入の組み合わせとして行われます。

これが私の質問です: これは、挿入、削除、および並べ替えを実装するための合理的な戦略ですか? それについてもっと良い方法はありますか?このテーマに関する良い記事やブログ投稿はありますか? 私は見ましたが、適切なものは何も思いつきません。

ご協力いただきありがとうございます。

4

2 に答える 2

1

私はこの問題を理解しました。Index プロパティは必要ですが、ObservableCollection を並べ替える必要はありません。1 つのプロパティ Index を持つインターフェイス IIndexedObject を作成します。インデックスを作成する必要があるすべてのオブジェクトにそのインターフェイスを実装し、データベース テーブルに Index 列を追加します。

オブジェクト モデルに読み込むときは、データベース テーブルを Index プロパティで並べ替えます。これにより、リストが最後の実行と同じ順序でロードされることが保証されます。DataGrid の下部にある空白行を使用してオブジェクトを追加します。ビュー モデルの ICommand にバインドされた [削除] ボタンを使用して、オブジェクトを削除します。

ビュー モデルは、IIndexedObjects を含む ObservableCollection の CollectionChanged プロパティをサブスクライブします。イベントが発生すると、ビュー モデルはコレクションを ReIndexCollection サービス メソッドに渡します。このメソッドは、IIndexedObject を受け取ります。このメソッドは、コレクションを単純に繰り返し、各要素の Index プロパティに増分整数値を割り当てて、現在の順序に基づいてコレクションのインデックスを再作成します。コレクションをデータベースに永続化すると、次の実行時にコレクションが同じ順序でロードされるように、Index 値が保存されます。

必要なソートはデータベースのロード時にのみ行われるため、ObservableCollection をソートする必要はありません。DataGrid でアイテムを移動すると、その時点でコレクションの順序が変更されます。コレクションのインデックスを再作成するだけで、その順序がデータベースに保持されます。

全体として、私が予想していたよりもはるかに簡単です。私が WPF と MVVM を気に入っている理由の 1 つです。

于 2009-09-18T15:12:50.050 に答える