ViewModel中Model + Threading中的ObservableCollection

时间:2010-02-18 08:20:54

标签: c# mvvm multithreading

我们的场外开发团队使用ObservableCollection属性创建了一个Model。现在,我负责创建ViewModel,我遇到了麻烦,因为所述模型在BackgroundWorker(另一个线程)中运行 - 这意味着我无法通过挂钩CollectionChanged事件来更新View。这是我做的解决方法:

private Model model = new Model();
public ObservableCollection<Entry> Entries { get; set; }

public ctor()
{
    BackgroundWorker peon = new BackgroundWorker();
    peon.DoWork += work;
    peon.RunWorkerCompleted += updateViewCollection;
    peon.RunWorkerAsync();
}

private void work(object sender, DoWorkEventArgs e)
{
    model.DoSomething();
}

private void updateViewCollection(object sender, RunWorkerCompletedEventArgs e)
{
    // model.entries is an ObservableCollection<Entry>
    foreach (Entry en in this.model.entries) 
    {
        if (!this.Entries.Contains(en))
            this.Entries.Add(en);
    }
}

有没有更好的方法通过Threaded ViewModel将Model的ObservableCollection挂钩到View的ObservableCollection?

2 个答案:

答案 0 :(得分:0)

我假设你正在使用wpf或silverlight。 您可以像在单个线程上一样挂钩事件,但将它们封送回Dispatcher对象(Invoke())。假设您的可观察集合是线程安全的,那么您应该没有问题。

答案 1 :(得分:0)

看看这个 http://nuget.org/List/Packages/Caliburn.Micro.INPC

它有一个视图模型库,它实现了自动编组到ui线程的属性。还有一个扩展ObservableCollection的类,它执行与BindableCollection相同的操作。