【问题标题】:wpf mvvm threading.Timer and TimerCallback problemswpf mvvm threading.Timer 和 TimerCallback 问题
【发布时间】:2011-05-10 16:13:25
【问题描述】:

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

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

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

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

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

  1. 如何解决这个问题?
  2. 更重要的是,为什么我只在使用 CollectionViewSource 时才会遇到这个问题?如果我删除 CollectionViewSource 并将 ObservableCollection 设为公共属性,则不会出现此类异常。

任何帮助表示赞赏!谢谢, 德拉米

【问题讨论】:

    标签: wpf mvvm timer callback collectionviewsource


    【解决方案1】:
    1. 使用 DispatcherTimer 代替您现在使用的计时器类,并确保在 UI 线程上创建它。
    2. 可能只有 ObservableCollection 您的 UI 没有更新。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • (psst, DispatcherSynchronizationContext)
      • SynchronizationContext.Current 将检索当前应用程序的同步上下文(如果从 UI 线程访问);大概这将是 WPF 中的 DispatcherSynchronizationContext。
      猜你喜欢
      • 1970-01-01
      • 2010-12-15
      • 2011-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-18
      • 1970-01-01
      相关资源
      最近更新 更多