阻止UI的WPF快速CollectionChanged事件。哪里&如何实现CustomControl的延迟更新

时间:2011-10-04 13:47:26

标签: c# .net wpf

我创建了一个有点复杂的CustomControl,虽然经过优化和线程化,但在绑定集合更改后仍需要花费大量时间来更新UI。

我将此控件绑定到DataGrid的SelectedItems集合。

本身,SelectedItems集合为集合中的每个项目触发CollectionChanged事件。

因此,例如,用户拖动鼠标以选择10个项目,这会导致10个CollectionChanged事件快速连续触发。

这反过来导致我的控件连续更新10次,导致UI被阻止。

要清楚,我的控件确实在后台线程中完成了所有处理,并且经过优化以在UI线程上完成最少量的工作。

“延迟”控件更新的正确方法(或某些选项)是什么,以便快速CollectionChanged事件(甚至数据绑定更改)导致最小数量的更新?

谢谢你的建议。

2 个答案:

答案 0 :(得分:3)

如果您正在处理CollectionChanged SelectedItems DataGrid的{​​{1}}事件,那么就无法逃脱。 :(

虽然您可以做一件事,但不要通过订阅CollectionChanged的{​​{1}}事件直接更新自定义控件,请使用基于DataGrid的中间发布者 - 订阅者队列对。计时器将每500毫秒发布一次其条目(机器速度慢但对用户来说似乎很快)然后每500毫秒发布一个事件,所有集合更改事件在500毫秒中一起发布(所有e.NewItems和e.OldItems一起收集)

发布商计时器只有在找到至少一个尚未发布的集合更改条目时才会开始计时。

答案 1 :(得分:0)

绑定异步可能会有所帮助。这样,首先处理UI的其余部分。

    Text="{Binding Path=MyGabeLib.Search.SelectedDoc.DocTextDownloadFirstPage,
           IsAsync=True, FallbackValue=Waiting_For_Server, Mode=OneWay}" /> 

同样对于昂贵的计算,我通常会保存输入和结果,如果输入没有改变,那么我会返回先前的结果,因为UI通常会多次调用get。