0

ViewModel コンストラクターが TimerCallback でタイマーを設定する MVVM フレームワークに対して開発された WPF アプリケーションがあります。

TimerCallback は ObservableCollection を取得し、それを VM のフィールドに渡します。

Source プロパティが ObservableCollection に設定されている CollectionViewSource があります。コレクションのフィルタリングを有効にしたいので、CollectionViewSource を使用しています。

TimerCallback が ObservableCollection をローカル フィールドに渡そうとすると、CollectionViewSource の Source プロパティに例外 {"別のスレッドが所有しているため、呼び出し元のスレッドはこのオブジェクトにアクセスできません。"} が発生することがわかりました。

例外は理解できますが、2 つの問題があります。

  1. この問題を回避するにはどうすればよいですか?
  2. さらに重要なのは、CollectionViewSource を使用している場合にのみこの問題が発生するのはなぜですか? CollectionViewSource を削除して ObservableCollection をパブリック プロパティにすると、そのような例外は発生しません。

どんな助けでも大歓迎です!ありがとう、ドラミー

4

2 に答える 2

2
  1. 現在使用してDispatcherTimerいるタイマー クラスの代わりに を使用し、必ず UI スレッドで作成してください。
  2. おそらくObservableCollection、UI だけでは更新されません。
于 2011-05-10T16:19:33.233 に答える
1

質問に部分的に答えるには、UI 要素によって観察される可能性のある ObservableCollection の更新は、UI スレッドを介してディスパッチする必要があります。MVVM でこれを行う場合、私の戦略は、アプリケーションの起動時に初期化する ViewModel のコンストラクターに SynchronizationContext を挿入することです。これにより、ビューと同期する必要がある更新をディスパッチする、ビュー フレームワークに依存しない方法が得られます。

于 2011-05-10T16:20:52.767 に答える