この質問は、この古い質問のフォローアップであり、未解決の質問というよりも確認です。
私の ViewModel インスタンスには、Model のプライベート インスタンスがあります_modelInst
。
ViewModel は、編集中にモデルのデータに排他的にアクセスできます (したがって、モデルは INotifyPropertyChanged を実装する必要はありません)。
ビューからモデルデータを編集する方法を思いついたのは、次の 3 つの方法です。
単純な値フィールドなど、Model インスタンスで直接取得/設定する
これは 簡単に実装できます...
return _modelInst.fieldname;
_modelInst.fieldname = value;
ViewModel インスタンスを作成し、親のデータ構造を操作します (
例: structs のようなより複雑なオブジェクト タイプの場合)。- その型の新しい ViewModel を作成します。
ViewModel は、親とそのフィールド名を認識しています。 - それを ContentControl+DataTemplate に表示する
- 取得/設定:
パラメータとしてフィールド名を持つ親のメソッドを介して、
1 つのフィールドのみが変更された場合でも元のオブジェクト全体を上書きします
_modelInst
これは、これらの構造のそれぞれに対して、親によって実装された新しいインターフェイスを作成することを意味します (更新ルーチンは で動作します)。- その型の新しい ViewModel を作成します。
親クラス内のクラス (のリスト) など、親のデータ構造を直接認識せずに ViewModel インスタンスを作成するクラスごとに新しい ViewModel を作成する
経由で親に更新指示を送信する
- コマンド
- メッセージ
- リフレクション (親
は、インスタンスを格納されているすべての子と比較することにより、関数を呼び出した子を認識します)
これらはすべて、編集可能なモデルのすべてのフィールドに対して関数を作成し、実装するのが非常に面倒です。
これは、モデルのほぼすべてのフィールドを意味します...
(4.) リフレクションのみを介して機能する一般的な ViewModel を作成できます。ここで、各サブオブジェクトはその親とそのフィールド名 (リストの場合は +index) を認識します。
ルートのロジックのみがモデルに干渉します。
しかし、その解決策には、フィールドへのパスを 内に格納する手段も必要です_modelInst
。
これを達成するための他の(より簡単な)方法はありますか?
MVVM の原則を (また) 誤解していましたか?
MVVM は大規模な階層データ構造の操作に適していますか?