0

ようやく WPF の変更通知を把握できたと思ったら、Timer の盗人が私の幻想を壊してしまいました...

public MyModel _objectToRefresh;

public Refresher(MyModel objectToRefresh,Dispatcher dispatcher)
{
    _objectToRefresh= objectToRefresh;
    _objectToRefresh.DisplayMessage = "ChangeNotification works for this one!";

    _timer = new DispatcherTimer(TimeSpan.FromSeconds(3),
                                DispatcherPriority.Background,
                                eh,
                                dispatcher);
    _timer.Start();
}

private void eh(object sender, EventArgs e)
{
    _objectToRefresh.DisplayMessage = "This Change will not show in the UI";
}

補足として、MyModelINotifyPropertyChanged を実装します。では、UI スレッドで DispatcherTimer を実行するとどうなるでしょうか。ここで何が問題なのか誰か説明できますか?

4

3 に答える 3

1

依存します。タイマーが UI スレッドで呼び出されない場合は、間違ったディスパッチャーを渡した可能性があります。タイマー関数を UI スレッドで実行する場合は、UI ディスパッチャーを渡す必要があります。

于 2013-05-15T10:58:07.857 に答える
1

MyModelを実装する必要があるだけINotifyPropertyChangedでなく、 のセッターがイベントDisplayMessageを発生させる必要がありPropertyChangedます。

String displayMessage;    
public String DisplayMessage {
      get { return displayMessage; }
      set { if (value != displayMessage) {
              displayMessage = value;
              PropertyChanged(this, new PropertyChangedEventArgs("DisplayMessage"));
            }
      }
    }
于 2013-05-15T11:27:22.493 に答える
0

わかりました、今見つけました。それを説明するには、ユースケースについて詳しく説明する必要がありますが、これは少し難しいと思います。

簡単に言えば、私のバインディングは高レベルのプロパティに関連していますが、実際にはツリーのさらに下のプロパティを変更します (バインディングではなくコードによって評価されます)。そのため、誰も変更通知を気にしません:-(

于 2013-05-15T13:21:34.813 に答える