【问题标题】:wpf MVVM ObservableCollectionwpf MVVM ObservableCollection
【发布时间】:2011-06-12 18:25:24
【问题描述】:

我的模型有几个属性,一个是字符串,另一个是 observablecolletion。创建模型时,它会触发一个后台工作线程来基本上轮询 .dll 以获取数据。根据它接收到的数据,它将设置字符串和/或将项目添加到可观察集合。我的字符串属性似乎可以很好地触发其 Onproperty 更改并且视图会更新。但是,我的 observable Collection 抛出了一个跨线程异常。我尝试移动代码,将 ObesrvableCollection 设置为 worker.ReportProgress 并得到相同的错误。我已将逻辑移到视图模型中,但仍然出现相同的线程错误。我不确定为什么我的字符串属性适用于一个。我已阅读有关 Dispatcher.Invoke 的信息,但我很确定我的模型不应该意识到这一点。谁能解释一下解决这个问题的正确方法。

仅供参考 - 我的观点与我的模型没有直接关系。我的 viewModel 中有我的模型的属性,并且模型通过构造函数注入传递。只是想在任何人认为我的模型直接与视图对话之前把它放在那里。

【问题讨论】:

    标签: wpf multithreading mvvm observablecollection


    【解决方案1】:

    没有代码很难给出细节。但是,WPF 会自动为标量属性而不是集合封送属性更改通知。因此,您必须从非 UI 线程修改集合。

    您的虚拟机没有理由不能使用Dispatcher,或者如果您愿意,可以使用更通用的SynchronizationContext。但是,它会使测试变得更加棘手。

    如果您发布代码,可能有一种方法可以简化事情。

    【讨论】:

      【解决方案2】:

      正如 Kent 所说,如果您不在 UI 上,则需要使用 Dispatcher 来更新您的收藏:

      Application.Current.Dispatcher.Invoke(new Action(() =>
      {
          // update your ObservableCollection here
      }));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-03-29
        • 1970-01-01
        • 2023-04-06
        • 2011-08-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多