【问题标题】:Collectionviewsource - different Thread owns itCollectionviewsource - 不同的线程拥有它
【发布时间】:2012-05-11 11:26:18
【问题描述】:

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

我已经尝试过不同的调度,例如:

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

这个代码块没有带来异常,但我也不会更新用户界面......它似乎什么都不做。

谁能帮帮我?

【问题讨论】:

    标签: wpf multithreading dispatch


    【解决方案1】:

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

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

    应该为您评估 LINQ...

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

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

    但这只是我的意见,因为我不知道您在这里的线程上下文。但请尝试让我知道。

    【讨论】:

    • 嘿,感谢您的提示,但是当我使用以下命令将 Datagrid 的 ItemsSource 直接设置为数据库时:`datagrid.ItemsSource = _db.Table;` 然后 datagrid 没有 ' 写入数据库中的新条目时自动更新... :(
    • 当您收到数据库更新事件时,您是否尝试过Table.AcceptChanges()?另外,如果这也不起作用,您是否尝试过我关于.ToList() 的原始提示?
    • 好的,试试最后一个技巧...而不是application.current.dispatcher.Invoke,试试cvs.Dispatcher.BeginInvoke(和.ToList()
    • 好的...我已经这样做了:'CollectionViewSource cvs = __calls.FindResource("cvsCalls") as CollectionViewSource; cvs.Dispatcher.BeginInvoke((Action)(() => { cvs.Source = _db.Anrufe.OrderByDescending(nr => nr.Datum).Take(200).ToList(); }));´ 不起作用: ( ... 网格不会自动更新
    猜你喜欢
    • 1970-01-01
    • 2022-01-13
    • 2013-01-14
    • 1970-01-01
    相关资源
    最近更新 更多