どうやってそんなことをするのかしら。ツリーを変更するMVVMCRUDアプリがあるとします(たとえば、メニュー構造)。メニュー項目と2つのビューを備えたビューモデルがあります。1つ目はaTreeViewで、2つ目はDataForm。です。主な問題は次のとおりです。
DataForm階層データを処理できません。- で選択したメニュー項目に応じて、異なるフィールドのセットを表示
TreeViewするDataForm必要があります(たとえば、子のあるメニュー項目とないメニュー項目の場合)。
私は次のようになってしまいました。ビューモデルには3つのフィールドがあります。
Items— 階層データソースを構築するためMenuItemの独自のコレクションを持つオブジェクトのコレクション。ChildrenSelectedItem—現在。で選択さ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の方法ではありません(読み取り:は受け入れられません)。TreeViewPreviewSelectionChangedBeforeSelectionChangedTreeViewDataForm
DataForm変更されたときに変更を強制的にキャンセルするAutoCancelのようなものはありCurrentItemますか?たぶん、開発チームの誰かが答えることができますか?または、そのような問題にどのように対処しますか?