Collectionviewsource - 不同的Thread拥有它

时间:2012-05-11 11:26:19

标签: wpf multithreading dispatch

我在这里遇到了一个新问题。我有一个MainWindow,其中是一个ContentGrid,在这是一个框架。现在我已经创建了不同的页面,可以在这个“内容区域”中显示。在其中一个页面中,有一个Datagrid绑定到CollectionViewSource,Source是一个数据库(通过EntityFramework)。现在,当发生对此数据库表的更改时(通过ServiceBroker和SQLDependency解决,触发工作正常)Datagrid必须更新。 现在问题: “Dependency_OnChange”-Event正在MainWindow-Thread中工作。当我尝试访问页面的CollectionViewSource以更新它(cvs.View.Refresh)时,我得到一个异常,这是不可能的,因为另一个拥有此CVS的线程。

我尝试过不同的Dispatching,如:

Application.Current.Dispatcher.Invoke((Action)(()=>
                {
                    cvs.Source = _db.Table.OrderByDescending(nr => nr.Date).Take(200);
                    cvs.View.Refresh();
                }));

此Codeblock不会带来异常,但我也不会更新UI ......似乎它什么也没做。

任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:1)

如果您的LINQ查询评估,您的数据网格将更新。现在它只是指定了LINQ IEnumerable,但没有对它进行评估。

    cvs.Source = _db.Table.OrderByDescending(nr => nr.Date).Take(200).ToList(); 

应该为你做LINQ的评估......

虽然我必须说你的cvs.View.Refresh()电话非常昂贵,因为它会导致整个网格刷新。您可能需要考虑更好的设计。

为什么不直接将dataGrid.ItemsSource = _db.Table.DefaultView设置为数据网格的项目源。我想如果你的表更新(和peforms _db.Table.AcceptChanges();),视图会自动通知对网格的更改,网格可能会更快地自我更新!

但这仅仅是我的意见,因为我不知道你的线程上下文。但仍然尝试让我知道。