どうやってそんなことをするのかしら。ツリーを変更するMVVMCRUDアプリがあるとします(たとえば、メニュー構造)。メニュー項目と2つのビューを備えたビューモデルがあります。1つ目はaTreeView
で、2つ目はDataForm
。です。主な問題は次のとおりです。
DataForm
階層データを処理できません。- で選択したメニュー項目に応じて、異なるフィールドのセットを表示
TreeView
するDataForm
必要があります(たとえば、子のあるメニュー項目とないメニュー項目の場合)。
私は次のようになってしまいました。ビューモデルには3つのフィールドがあります。
Items
— 階層データソースを構築するためMenuItem
の独自のコレクションを持つオブジェクトのコレクション。Children
SelectedItem
—現在。で選択さMenuItem
れていTreeView
ます。EditedItem
—EditViewModel
基本的に2つの子孫を持つオブジェクト:MenuItemEditViewModel
とLeafMenuItemEditViewModel
。このプロパティは、SelectedItem
が変更されると自動的に設定されます。その実際のタイプは、SelectedItem.Children
空から推測されます。
TreeView
とにバインドされItems
てSelectedItem
います。DataForm
この場合、通貨を維持する必要はありません(代わりに、現在のアイテムはによって設定されますTreeView
)。また、アイテムの作成と削除を担当しません。そのため、CurrentItem
モデルを表示するためにそれだけをバインドすることにしましたEditedItem
(バインドされていませItemsSource
ん)。AutoCommit
に設定されていますFalse
(バインドされていない場合、バインドTrue
されていない場合、でItemsSource
別のアイテムを選択すると、現在のすべてのアイテムの変更が新しく選択されたアイテムにコピーされますTreeView
。これはあまり良くありません)。DataForm
フィールドは自動生成されます。
明らかに、でアイテムを選択した場合、でTreeView
いくつかの変更を加えて、DataForm
で別のアイテムを選択しようとすると、TreeView
よく知られるようになります。
アイテムに検証エラーがある場合、またはアイテムが編集中でAutoCommitがfalseの場合、通貨を変更できません。代わりにItemsSourceをICollectionViewに設定して、通貨を管理します
この場合DataForm
、すべての変更を暗黙的に破棄します。選択したアイテムが変更さDataForm.CancelEdit()
れる前に呼び出す回避策があります(通常はまたはのようなイベント)。ただし、とは完全に異なるビューで定義されているため、MVVMの方法ではありません(読み取り:は受け入れられません)。TreeView
PreviewSelectionChanged
BeforeSelectionChanged
TreeView
DataForm
DataForm
変更されたときに変更を強制的にキャンセルするAutoCancelのようなものはありCurrentItem
ますか?たぶん、開発チームの誰かが答えることができますか?または、そのような問題にどのように対処しますか?