重置绑定正在阻止WPF中的UI

时间:2018-12-21 18:17:33

标签: c# wpf data-binding datagrid

我的应用程序用户可以添加DataGrids并可视化从服务器获取的某些数据。问题是,每获取500ms数据,并且我需要刷新DataGrid上的绑定。我正在绑定到BindingList(具有可观察的集合,我也有同样的问题),并且此绑定刷新阻塞了我的UI线程。

由于DataGrid是在UI线程上创建的,因此我正在使用Dispatcher更新它们上的绑定:

App.Current.Dispatcher.Invoke((Action)delegate
{
  TableConfiguration.ObservedRegisters.ResetBindings();
});

有什么方法可以使此过程更快?我查看了性能分析器工具,根据它,上面的一行引起了所有麻烦。当我注释掉它时,UI可以正常工作,但是datagrids的值当然不会刷新。

DataGrid的

ItemSource是绑定列表,它可以包含50多个元素。使用这些网格中的三个,我无法在UI上执行任何操作。 我知道-我也许应该使用ObservableCollection,但是问题仍然存在。你有什么建议吗?

1 个答案:

答案 0 :(得分:1)

每500毫秒是半秒。 我会考虑将其节流到每秒或更长时间。 如果他们需要更频繁地查看更改,那么数据网格将使读取数据的工作比某些图形表示更加困难。

在WPF中,通常使用observablecollection而不是bindinglist。绑定时,绑定列表是否不会在每一行和每个属性上通知更改?

我将更改为observablecollection,并使用inotifypropertychange通知对集合或属性的更改。

仅更改并根据需要通知更改。

如果一切都必须改变。 重建集合并设置itemssource绑定到的属性,并在其上更改属性。

如果数据的工作方式是更改一条或两条记录而不是全部记录,那么您可以将observablecollection中的那些特定项设置为新实例。

这似乎是不可能的情况。您的所有数据每半秒更改一次。 一个或两个属性的可能性更大,也许行会更改。

如果仅更改一个或两个属性,则仅更改那些属性并在其上使用更改通知。

如果一切都是非常动态的,并且您需要一个数据网格,则可以将依赖对象用作视图模型。对每行使用依赖项对象,并对每个属性/列使用依赖项属性。绑定在dp上解析更快。但是再说一次。使用一个可观察的集合。

在所有单元上安排度量也存在成本。如果您可以使用固定宽度的列,则该列会减少。