6

正常に動作する C# WPF MVVM アプリケーションがあります。

唯一の問題は、テキストボックスを変更してメニューをクリックしたときです。別のコントロールをクリックせずにこれを行うと、テキストボックスがフォーカスを失っていないため、view->viewmodel イベントは発生しません。私が間違っている場合は修正してください。ただし、RaisePropertyChanged は LostFocus (または OnBlur、または同様のイベント) でのみ発生すると思います。

そのため、テキストボックスを編集した直後にメニューの保存ボタンをクリックすると、ビューモデルは古い値を使用してデータを保存します。

したがって、再開します:

このシーケンスは正常に機能します。

  1. テキストボックスを編集する
  2. 別のコントロールをクリックします
  3. RaisePropertyChanged が発生し、viewmodel が更新されます
  4. メニューの保存ボタンをクリック
  5. 正しい値で保存されたデータ

このシーケンスは私にエラーを与えます:

  1. テキストボックスを編集する
  2. メニューの保存ボタンをクリック
  3. 正しい値で保存されたデータ

これを解決するには?

4

2 に答える 2

12

これは、WPF と WinForms の両方で TextBoxes を使用する場合によくある落とし穴です。フォーカスを失ったときではなく、TextBox が変更されるたびに VM を更新するようバインディング システムに指示することで、これを回避できます。これを行うにUpdateSourceTriggerは、バインディングの を に設定しPropertyChangedます。これにより、TextBox がそのプロパティのPropertyChangedイベントを発生させるたびに、VM に書き戻されます。Text

<TextBox Text="{Binding MyText, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
于 2013-07-03T21:04:36.587 に答える
8

依存関係プロパティの場合TextBox.Text、そのデフォルトUpdateSourceTriggerLostFocus(つまり、コントロールがフォーカスを失ったときにビュー モデル プロパティが更新される) です。テキストが入力されるたびにプロパティをすぐに更新するには、 を設定しUpdateSourceTrigger=PropertyChangedます。(詳細については、上記のリンクを参照してください。実際には、具体的に例をカバーしています。)

于 2013-07-03T21:04:36.273 に答える