MVVM - 从BackgroundWorker创建可观察集合 - DependencySource / Object错误

时间:2015-02-11 10:18:34

标签: c# multithreading mvvm backgroundworker dependency-properties

我刚刚为我的应用程序引入了加载动画。代码运行,但是当我与应用程序接口时,它崩溃时出现错误“必须在与DependencyObject相同的线程上创建DependencySource。”

我修改了代码,以便只检索&进程数据应该在后台线程上,并且在UI线程之后初始化任何类型的ObservableCollections。

然而,错误仍然被抛出!如果我只让后台工作程序处理'RetrieveItems'方法,那么它的行为,但大多数处理是在'ApplyFilters'方法中完成的 - 这是非常广泛的,但最终会返回一个IItemGroupViewModel列表。在这里可能会做什么样的事情干扰UI? 我相信它正在显示问题的ItemGroups - 尽管组列表正确返回并且在UI线程上可见。我还可以查看初始选项卡,它包含在RetrieveItems方法中创建的ItemViewModel。

我发现这也无法调试。

以下是代码:

    public void Start()
    {
        var bgw = new BackgroundWorker();
        bgw.DoWork += bgw_DoWork;           
        bgw.RunWorkerCompleted += bgw_RunWorkerCompleted;

        _tabList = GenerateTabs();

        DisplayLoadingScreen = true;           
        bgw.RunWorkerAsync();
    }

    private void bgw_DoWork(object sender, DoWorkEventArgs e)
    {
        var itemVMs = RetrieveItems(_pciSelectionViewModel.SelectedPcis);

        var itemGroups = ApplyFilters(
             _pciSelectionViewModel.SelectedPcis, itemVMs, 
             _pciSelectionViewModel.UserQuestionList, _tabList);
        e.Result = Tuple.Create<IEnumerable<IItemViewModel>, IEnumerable<IItemGroupViewModel>>(itemVMs, itemGroups);
    }


    private void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        DisplayLoadingScreen = false;
        var res = e.Result as Tuple<IEnumerable<IItemViewModel>, IEnumerable<IItemGroupViewModel>>;
        InitialiseObservableCollections(res.Item1, res.Item2);
    }


    public void InitialiseObservableCollections(IEnumerable<IItemViewModel> itemVMs,
        IEnumerable<IItemGroupViewModel> itemGroups)
    {
        AddAllocatedTabsToItems(itemGroups);

        ItemGroupCollection = new ObservableCollection<IItemGroupViewModel>(itemGroups);
        PciCollection = new ObservableCollection<IPciViewModel>(_pciSelectionViewModel.SelectedPcis);
        TabList = new ObservableCollection<IAnalysisTabViewModel>(_tabList);
        ItemCollection = new ObservableCollection<IItemViewModel>(itemVMs);
        AssignedTabFiltersCollection = new ObservableCollection<string>(GenerateItemTypeFilters(_tabList));

        foreach (var itemGroup in itemGroups)
        {
            itemGroup.PopulateInternalData(_pciSelectionViewModel.SelectedPcis);
        }
        _tabList.ToList().ForEach(t => t.Update());

    }

0 个答案:

没有答案