wpf mvvm threading.Timer和TimerCallback问题

时间:2011-05-10 16:13:26

标签: wpf mvvm timer callback collectionviewsource

我有一个针对MVVM框架开发的WPF应用程序,其中ViewModel构造函数使用TimerCallback设置Timer。

TimerCallback检索ObservableCollection并将其传递给VM上的字段。

我有一个CollectionViewSource,其Source属性设置为ObservableCollection。我正在使用CollectionViewSource,因为我想在Collection上启用过滤。

我发现当TimerCallback尝试将ObservableCollection传递给本地字段时,CollectionViewSource的Source属性有一个异常{“调用线程无法访问此对象,因为另一个线程拥有它。”}。

我理解异常,但我有两个问题:

  1. 如何解决这个问题?
  2. 更重要的是,为什么我在使用CollectionViewSource时才会遇到此问题?如果我删除CollectionViewSource并使ObservableCollection成为公共属性,那么我没有这样的异常。
  3. 任何帮助表示赞赏!谢谢, Drammy

2 个答案:

答案 0 :(得分:2)

  1. 使用DispatcherTimer代替您现在使用的计时器类,并确保在UI线程上创建它。
  2. 可能只有ObservableCollection您的用户界面未更新。

答案 1 :(得分:1)

要部分回答您的问题,必须通过UI线程调度UI元素可能观察到的ObservableCollection的任何更新。当我希望在MVVM中执行此操作时,我的策略是将SynchronizationContext注入到我在应用程序启动期间初始化的ViewModel的构造函数中。这为我提供了一种独立于View框架的方式来分派必须与View同步的更新。