1

我这里有一个新问题。我有一个 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();
                }));

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

谁能帮我?

4

1 回答 1

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();),视图会自动通知对网格的更改,并且网格可能会更快地更新自身!

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

于 2012-05-11T11:41:21.603 回答