質問:変更がビューモデルに反映される前にUIの変更をインターセプトする方法はありますか?具体的には、ComboBox
で動作するものが必要です。しかし、これらはすべて、これらの2つの欠点の1を持っている:UIで何かが変わった後、「キャンセル」(this one、またはthis oneを例えば):それをバック変更していることを検出する方法はたくさんありますインターセプトUIの変更* before *ビューモデルへのアクセス
- 基礎となるモデルが変更され、実際に取り消される代わりに元に戻されます。
- キャンセルはビューモデルで行われるため、キャンセルするためのUIもビューモデルに入れなければなりません。
背景:私はいくつかのFoos
とComboBox
とフォームを持っています。ユーザーは選択したFoo
を自由に変更する必要があります(一度「Foo
」を選択すると、その設定を保持しないでください)。選択したFoo
を変更すると、ユーザーが選択したビューモデルの一部の設定が無効になることがあります。ユーザーは「Fooを変更してもよろしいですか?」という警告メッセージをメッセージボックスに表示し、Foo
を変更しないと変更がキャンセルされます。選択されたFoo
の値を変更してそれを元に戻す問題は、無効化する必要があるものを決定するロジックをVMバッキングプロパティ(おそらくNotifyPropertyChanged(Foo)
またはそのすぐ隣)に設定する必要があります。変更がキャンセルされたかどうかは設定が無効になります。私の問題を解決
直交質問:
- 私はそれを曲げることが想定されていないような方法でMVVMパラダイムを曲げるようにしようかな?キャンセルUIをUIに移動して、ビューモデルでキャンセル動作を維持する方法を探していますか?
- 「変更を元に戻しても機能しない」という主張は正確ではありませんか?変更が戻って無効化を開始(または抑制)した後で、後で後で接続する場所がありますか?
私は質問ではっきりしていないようです。無効化はViewModelで発生します(したがって、無効な設定が削除されてUIが更新されます)。モデルは、フォームからOKを選択したときに有効な設定のみが書き込まれます。私は質問 – Jonny
を更新します私はあまりにも明らかにされていないように見える - ビューモデルのバウンドプロパティが無効にされても問題はありません。ビューモデルは、モデル内にまだあるため、ユーザーが編集をキャンセルすることを選択したときにそのデータを復元できます。ユーザーが[OK]をクリックするまでモデルの変更を遅らせるだけです。 – Haukinger