博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DataGrid CollectionViewSource Refresh性能问题
阅读量:4594 次
发布时间:2019-06-09

本文共 4485 字,大约阅读时间需要 14 分钟。

在WPF中,CollectionViewSource是一个经常用到的集合类型,主要用于对后台数据排序,条件筛选或分组操作。
     场景:当需要筛选包含“test”的数据项时,我们会分步输入搜索条件,依次为“t”、“te”、“tes”,而最后是“test”,而我们简单的处理经常会是在Textbox的TextChanged事件中直接添加CollectionViewSource的View的Refresh,这样筛选操作实际上进行了四次筛选操作,每一步筛选操作都会Filter及RefreshUI,对于应用来说,前几次的Filter及RefreshUI均是无用的,白白浪费了资源。
     解决方案:
     1:TextChanged中的Refresh操作进行延迟刷新,即用户输入完成后先不进行刷新,超过一定的时间再进行刷新,对于筛选条件,需要一个定时器延迟,(当筛选条件过多时,定时器数量过量,不易管理,易出错)
     2:将延迟做到CollectionViewSource中View的刷新供码中,比如,封装一个方法SourceRefresh,协定刷新_source时只能通过SourceRefresh方法。
private CollectionViewSource _source = new CollectionViewSource();        private DispatcherTimer timer=new DispatcherTimer();        public void SourceRefresh()        {            if(timer.IsEnabled)                timer.Stop();            timer.Interval = new TimeSpan(0, 0, 0, 0, 200);            timer.Tick += (sender, e) =>            {                timer.Stop();                if (null != _source.View)                    _source.View.Refresh();            };            timer.Start();        }

  看源码会比较直观点,如下:

  

  下面的代码是我写的例子,可以参考下:

  

public class MyListCollectionView
: ListCollectionView { public MyListCollectionView(IList list) : base(list) { _filterTimer.Interval = new TimeSpan(0, 0, 0, 0, 1); _filterTimer.Tick += (sender, e) => { CancelAllTimer(); RefreshFilter(); _freshUITimer.Start(); Console.WriteLine("A"); }; _freshUITimer.Interval = new TimeSpan(0, 0, 0, 0, 500); _freshUITimer.Tick += (sender, e) => { CancelAllTimer(); RefreshUI(); _freshCurrentTimer.Start(); Console.WriteLine("B"); }; _freshCurrentTimer.Interval = new TimeSpan(0, 0, 0, 0, 20); _freshCurrentTimer.Tick += (sender, e) => { CancelAllTimer(); RefreshCurrent(); Console.WriteLine("C"); }; } private DispatcherTimer _filterTimer = new DispatcherTimer(); private DispatcherTimer _freshUITimer = new DispatcherTimer(); private DispatcherTimer _freshCurrentTimer = new DispatcherTimer(); private bool _isFreshFilter = false; private void CancelAllTimer() { _filterTimer.Stop(); _freshUITimer.Stop(); _freshCurrentTimer.Stop(); } protected override void RefreshOverride() { _filterTimer.Start(); } protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs args) { if (!_isFreshFilter) base.OnCollectionChanged(args); } protected override void OnCurrentChanged() { if (!_isFreshFilter) base.OnCurrentChanged(); } protected override void OnPropertyChanged(PropertyChangedEventArgs e) { if (!_isFreshFilter) base.OnPropertyChanged(e); } private void RefreshFilter() { try { //cancel all _isFreshFilter = true; base.RefreshOverride(); } finally { _isFreshFilter = false; } } private void RefreshUI() { OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)); } private void RefreshCurrent() { OnCurrentChanged(); OnPropertyChanged("IsCurrentAfterLast"); OnPropertyChanged("IsCurrentBeforeFirst"); OnPropertyChanged("CurrentPosition"); OnPropertyChanged("CurrentItem"); } private void OnPropertyChanged(string proName) { OnPropertyChanged(new PropertyChangedEventArgs(proName)); } } public class MyCollection
: ObservableCollection
, ICollectionViewFactory { public MyCollection() { } public MyCollection(IList
list) : base(list) { } public MyCollection(IEnumerable
list) : base(list) { } public MyListCollectionView
_view; public ICollectionView CreateView() { _view = new MyListCollectionView
(this); return _view; } }

 

 

转载于:https://www.cnblogs.com/maigc249/p/5106749.html

你可能感兴趣的文章
Kotlin对象:仅一行代码就可创建安全的单例
查看>>
HDU 1556 区间查询
查看>>
ecshop缓存清理-限制或禁用ECShop缓存
查看>>
JS 正则匹配字符串
查看>>
Safe Area Layout Guide before iOS 9.0
查看>>
Machine learning - Introduction to Gaussian processes 学习记录
查看>>
[Computer Networking] {CMU14-740} Lecture 7: Peer to Peer Networking
查看>>
【转】马士兵_JAVA自学之路
查看>>
KTV项目总结
查看>>
Java序列化与反序列化
查看>>
windows eclipse IDE打开当前类所在文件路径
查看>>
memcache服务器端参数说明
查看>>
java动态生成验证码
查看>>
SQL SERVER 查询性能优化——分析事务与锁(一)
查看>>
WCF学习之旅—请求与答复模式和单向模式(十九)
查看>>
oracle权限
查看>>
Python 教程阅读笔记(十):标准库一瞥(续)
查看>>
[转] 演示Flash Text Engine(FTE) 的baseline相关属性
查看>>
Java - 35 Java 实例
查看>>
为Liferay开发应用程序
查看>>