私はこれに対する答えを2週間以上グーグルで検索しました。これは通常、私が盲目であるか、その考えがばかげていることを意味します。いずれかの方法:
中規模で非常に柔軟なプロジェクトで、構成データを次のような階層構造に格納しています。
- 構成 (コレクション)
- オーディオ (クラス)
- BaseDir (構造体)
- PlayMode (列挙型)
- 入力 (クラス)
- CalibrateOnConnect (ブール値)
- KnownDevices (コレクション)
- ... (クラス)
- ...
- ... (クラス)
- UseDevice (整数)
- プレイリスト(コレクション)
- FirstAudio (クラス)
- パス (文字列)
- 繰り返し (整数)
- FirstAudio (クラス)
- ...
- オーディオ (クラス)
これらを MVVM パターンの TreeView に表示することができました。将来どのオプションが追加されるか正確にはわからないので、一般的なアプローチを使用して、 、カスタムおよび基本値型 ( 、、、...) の ViewModelclass
を作成ienumerable
しstructs
ましstring
た。bool
enum
私の XAML では、これらには対応する (階層型) DataTemplates があります。たとえば、ブール値の CheckBox や一般的な値の型のテキストブロックがあります。
各 ViewModel インスタンスには、基になるモデルのデータを格納するフィールドがあります。
これらの値を View で編集し、TwoWay-Binding を介して ViewModel でも編集できます。
しかし、モデルでこのデータを更新する方法が頭を悩ませています。
リフレクションによって階層的な ViewModel 構造を作成するため、親には、同等の構成クラス / コレクションのフィールド名 / インデクサー / ... に対応する get/set プロパティがありません。各 ViewModel インスタンスは、それが作成された親のモデルのデータ構造のフィールド/プロパティ名を認識しており、親の ViewModel インスタンスも認識しています (ただし、親の Model インスタンスは認識していません)。
コマンドを介して、または親の更新機能を呼び出してこの問題を解決しようとするたびに、私の脳に結び目ができました。
通常のバインディング手法でこれを達成する簡単な方法はありませんか?
使用している構成 (サブ) クラスごとに ViewModel を作成したほうがよいでしょうか?
ヒント: 各 ViewModel インスタンスは、親のモデルのデータ構造でそのフィールド/プロパティ名を認識しています。