2

私の WPF アプリケーションでは、値CheckBoxIsCheckedビューモデルのプロパティにバインドされています。ビューモデルで値を設定する実際の行をコメントアウトしたことに注意してください。それは標準的なパターンです:

View.xaml

<CheckBox IsChecked="{Binding Path=SomeProperty}" />

ViewModel.cs

public bool SomeProperty
{
    get { return this.mSomeProperty; }
    set
    {
        if (value != this.mSomeProperty)
        {
            //this.mSomeProperty = value;
            NotifyPropertyChanged(new PropertyChangedEventArgs("SomeProperty"));
        }
    }
}

をクリックしてCheckBoxも、 の値が設定されないため、何も起こらないと思いますthis.mSomeProperty。ただし、観察された動作はCheckBox、 の値に関係なく、 がチェックされたりチェックされなかったりすることですthis.mSomeProperty

何が起こっている?CheckBoxバインディングが、基になるデータ モデルの設定を表示するように強制しないのはなぜですか?

4

1 に答える 1

3

ソースを更新した後、WPF はバインディング ソースから自動的にリロードしないためです。これはおそらくパフォーマンス上の理由によるものですが、主にバインディングの失敗を処理するためです。たとえば、整数プロパティにバインドされた TextBox を考えてみましょう。ユーザーが 123A と入力したとします。WPF は、TextBox の内容をプロパティの古い値に突然リセットするのではなく、ユーザーが入力した内容を修正できるように表示し続けたいと考えています。

そのため、CheckBox をクリックすると、WPF はバインドされたプロパティを再チェックするのではなく、コントロールの状態を表示し続ける必要があると想定します。

これについて私が見つけた唯一の方法は、あまりエレガントではありませんが、WPF がプロパティ セッターの呼び出しから戻った後にPropertyChanged を発生させることです。これは、Dispatcher.BeginInvoke を使用して実行できます。

set
{
  // ...actual real setter logic...
  Action notify = () => NotifyPropertyChanged(...);
  Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.ApplicationIdle, notify);
}

これを NotifyPropertyChanged 実装に統合することで、この実装の問題で個々のプロパティを汚染する必要がないようにすることで、これを少し軽減することができます。NotifyOnSourceUpdated と SourceUpdated 添付イベントを使用することもできますが、この可能性については調べていません。

于 2010-03-08T20:55:06.153 に答える