0

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

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

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

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

我理解这个例外,但我有两个问题:

  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 中执行此操作时,我的策略是将 SynchronizationContext 注入到我在应用程序启动期间初始化的 ViewModel 的构造函数中。这为我提供了一种独立于视图框架的方式来调度必须与视图同步的更新。

于 2011-05-10T16:20:52.767 回答