1

データグリッドの行を追加、挿入、および削除するためのボタンとショートカットを備えた非常に単純なインターフェイスで遊んでいます(基になるバインドされたコレクション)。また、元に戻すスタックを実装する必要もあります。しかし...このコントロールの内部ロジックをどうするかわかりません。デフォルトでは、DataGrid は新しい行を自動的に削除または追加でき、ユーザー入力 (Esc、F2 など) に対して他の多くの処理を実行するため、バインドされたデータが暗黙的に変更されます。

コマンドは VM 側で実行されるため、元に戻すスタックはその (または M の) ビジネスでもありますが、DataGrid には DataGrid への内部的に事前定義されたバインディングが含まれています。コマンド。そして、データへの変更を「監視」する簡単な方法がわかりません。

理想的な MVVM フローについての私の理解は次のようなものです: ユーザー アクション (ビュー) -> コマンド (VM) -> コマンド実行 + スタック操作の取り消し。(VM-M) -> VM の変更に合わせてそれぞれ UI が変更されます。

私は混乱しており、実装に関する良いアドバイスが必要です。

4

4 に答える 4

3

これについての2つの方法:

  1. ViewModel (POCO モデル) にすべてのロジックを配置します。

    ViewModel に Undo/Redo スタックを含める必要があります。どのように実装するかはあなた次第ですが、Undo/Redo スタックを of にすることをお勧めしますTuple<String, Object>。プロパティ名とプロパティの値を保存します。クローンを管理するよりも簡単です。また、UndoStack にアイテムがあるかどうかを確認することで、貧弱な人の「汚れ」チェックを行うこともできます。

  2. モデルに IUndoRedo (リッチ モデル) などのインターフェイスを提供します。

    ViewModels で元に戻す/やり直しのインターフェイス メソッドを呼び出す必要がありますが、考え方は同じですTuple<String, Object>....

    リッチ モデル アプローチが必要な場合は、リッチ モデル用に作成されたCSLA.Netなどの既存のフレームワークを参照できますが、実際に必要なものよりも少し多くなる可能性があります。本当にリッチなモデルが必要な場合に備えて、そこに捨ててください。


補足: ObservableCollection (ItemsSource) はモデルではなく ViewModel である必要があります。モデルを使用していた場合に備えて、それを捨ててください。つまり、しないでObservableCollection<IEmployee>くださいObservableCollection<EmployeeViewModel>。それは物事をより簡単に、より簡単に、そしてより再利用可能にします!

別の補足事項: DataGrid を避けるようにしてください。開発者は髪を引きちぎりたくなる。ListView を使用して独自の「グリッド」を展開するだけです:)

于 2011-11-02T18:10:26.713 に答える
1

通常、元に戻すロジックをモデル自体に組み込みます。UI にどのようにバインドするかを考える前に、思い通りに完全に機能するようにしてください。

于 2011-11-02T17:41:47.767 に答える
1

MVVM での取り消し/やり直しに関する記事を作成しました。これは 2 つの部分に分かれています。最初の部分では一般版の元に戻す/やり直しについて説明し、2 番目の部分ではリストの操作について説明します。

パート 1: ビューモデル パターンを使用して WPF で元に戻す/やり直しを提供する

パート 2: ビューモデリング リスト

フローは次のとおりです: ユーザー操作 (ビュー) -> コマンド (VM) -> コマンド実行によりモデルが変更されます -> モデルが VM に変更を通知します -> VM がビューに変更を通知します。このようにして、モデルが他のソースから変更された場合、ビューも更新されます。

ここにも github プロジェクトがあります。

于 2011-11-03T10:31:28.287 に答える
0

DataGrid はコレクションにバインドされているため、DataGrid ではなくコレクション自体への変更を監視できます。コレクションのイベントを使用しCollectionChangedて追加または削除されたPropertyChangedアイテムを監視し、編集を監視するためにコレクションのすべてのアイテムにイベントを登録します。

別のアイデアとして、 のRevertChanges代わりにコマンドを提供することもできますUndoChanges。元のコレクションを保存するだけで済み、必要に応じて復元できるため、実装がはるかに簡単です。

于 2011-11-02T17:40:56.743 に答える