WPF listbox 通过绑定后台数据自动显示的效率问题

沾上了甩不掉 2012-08-04 11:14:53
ListBox绑定后台数据,使用数据模版,自动界面显示,主要过程如下:
1)定义数据源
private ObservableCollection<sms> dataSourceSms;
this.dataSourceSms = SmsService.SmsList;
2)指定模版(在Loaded时根据数据源对模版中内容进行更新显示)
this.listBoxShortMessage.ItemTemplateSelector = new DataTemplateSelectorHistory();
3)ListBox与数据源关联
this.listBoxShortMessage.ItemsSource = this.dataSourceSms;

当数据源数据量过多时(其实也就几百条),界面显示时会慢,尤其当拖动ListBox滚动条时也很慢,
如何解决此问题,赐教!
...全文
836 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
沾上了甩不掉 2012-08-10
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

把ScrollViewer.IsDeferredScrollingEnabled="true"加上试试,会降低一点性能。
说实话,这样的问题从来没遇到过……
[/Quote]

效果一样的,我在想想办法,有结果在这里公布,谢谢你。
一只熊猫 2012-08-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

指定ListBox的附加属性:
VirtualizingStackPanel.IsVirtualizing="True"
以及
VirtualizingStackPanel.VirtualizationMode="Recycling"
并保证附加属性
ScrollViewer.CanContentScroll="False"
承载上万条数据没有问题
[/Quote]

学习老
沾上了甩不掉 2012-08-09
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

应该是你的Item,也就是sms类没有实现INotifyPropertyChanged接口造成的。这时WPF不能接收到更改通知,就不会去刷新
[/Quote]

INotifyPropertyChanged已经实现了,单读改一个属性是对应Item可以刷新的,而且整个页面内的所有Item也就刷新到正确值;就是在滚动的时候不刷新,滚动时应该不涉及到属性改变吧?
iyomumx 2012-08-09
  • 打赏
  • 举报
回复
把ScrollViewer.IsDeferredScrollingEnabled="true"加上试试,会降低一点性能。
说实话,这样的问题从来没遇到过……
沾上了甩不掉 2012-08-09
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

滚动会改变ScrollViewer的部分属性,不知道你指的不刷新是什么现象
[/Quote]

假设供有1000条记录,ListBox能显示出10条,滚动后应该显示后10条记录,依次类推,
目前现象是滚动后显示的记录内容不发生变化,还是最初10条的内容,
双击一条记录MessageBox出记录内容,内容(后台数据)确实变化的,只是界面不跟随刷新,
费解!
iyomumx 2012-08-09
  • 打赏
  • 举报
回复
滚动会改变ScrollViewer的部分属性,不知道你指的不刷新是什么现象
iyomumx 2012-08-08
  • 打赏
  • 举报
回复
应该是你的Item,也就是sms类没有实现INotifyPropertyChanged接口造成的。这时WPF不能接收到更改通知,就不会去刷新
沾上了甩不掉 2012-08-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

指定ListBox的附加属性:
VirtualizingStackPanel.IsVirtualizing="True"
以及
VirtualizingStackPanel.VirtualizationMode="Recycling"
并保证附加属性
ScrollViewer.CanContentScroll="False"
承载上万条数据没有问题
[/Quote]

我将ScrollViewer.CanContentScroll="True",这样加载很快,拖动时刷新也很快,但是有一个问题:
拖动时始终显示第一次显示出的那些Item,Item中的内容并没有跟随数据变化,也就是Item没有刷新。
但在从各种资料里了解的是 “Recycling”模式ItemsControl根据高度只加载部分Item,不会频繁进行建立/回收操作,仍然重复使用这些Item进行显示刷新以提高效率,那为什么我这里不刷新呢?
iyomumx 2012-08-06
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
用这个方法在拖动滚动条的时候确实很快了,多谢。
但还有一个问题,就是在初次加载时很慢,而且程序会“未响应”一段时间,这个咋办呢?
[/Quote]
试试异步读取数据,然后在低优先级逐条添加:

//假设在新的线程读取了数据IEnumerable<T> data;
//要添加进集合dataSourceSms
foreach (var item in data)
{
Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, i => dataSourceSms.Add(i), item);
}

也许有点作用
kakaniuren 2012-08-06
  • 打赏
  • 举报
回复

xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"


<xctk:BusyIndicator x:Name="_busyIndicator" BusyContent="正在加载,请等候..." >
...
...
...
</xctk:BusyIndicator>


可以给一个友好的提示,后台数据绑定完成后,控制 IsBusy=False
沾上了甩不掉 2012-08-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

指定ListBox的附加属性:
VirtualizingStackPanel.IsVirtualizing="True"
以及
VirtualizingStackPanel.VirtualizationMode="Recycling"
并保证附加属性
ScrollViewer.CanContentScroll="False"
承载上万条数据没有问题
[/Quote]

用这个方法在拖动滚动条的时候确实很快了,多谢。
但还有一个问题,就是在初次加载时很慢,而且程序会“未响应”一段时间,这个咋办呢?
沾上了甩不掉 2012-08-06
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

你的数据源有多少个属性? 几百条 x 几十个属性的话,我估计快不了
[/Quote]

也就4-5个属性,不是很多。
iyomumx 2012-08-04
  • 打赏
  • 举报
回复
指定ListBox的附加属性:
VirtualizingStackPanel.IsVirtualizing="True"
以及
VirtualizingStackPanel.VirtualizationMode="Recycling"
并保证附加属性
ScrollViewer.CanContentScroll="False"
承载上万条数据没有问题
一只熊猫 2012-08-04
  • 打赏
  • 举报
回复
你的数据源有多少个属性? 几百条 x 几十个属性的话,我估计快不了

111,093

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧