我有一个ListView
其中可能包含很多项目,所以它是virtualized
和回收物品。它不使用排序。我需要刷新一些值显示,但是当项目太多时,更新所有内容太慢,所以我想只刷新可见项目。
我怎样才能获得当前显示的所有项目的列表?我试图调查ListView
或在ScrollViewer
,但我仍然不知道如何实现这一目标。该解决方案不得遍历所有项目来测试它们是否可见,因为这会太慢。
我不确定代码或 xaml 是否有用,它只是一个Virtualized
/Recycling ListView
以其ItemSource
绑定到一个Array
.
Edit :回答 :
感谢 akjoshi,我找到了方法:
看看 MSDN 上的这个问题,展示了一种找出可见内容的技术ListView
items -
如何找到 ListView 中实际可见的行(ListViewItem(s))? http://social.msdn.microsoft.com/Forums/en/wpf/thread/8543eaa7-bd43-41ad-aee8-874d9b30799c
这是该帖子中的相关代码 -
listView.ItemsSource = from i in Enumerable.Range(0, 100) select "Item" + i.ToString();
listView.Loaded += (sender, e) =>
{
ScrollViewer scrollViewer = listView.GetVisualChild<ScrollViewer>(); //Extension method
if (scrollViewer != null)
{
ScrollBar scrollBar = scrollViewer.Template.FindName("PART_VerticalScrollBar", scrollViewer) as ScrollBar;
if (scrollBar != null)
{
scrollBar.ValueChanged += delegate
{
//VerticalOffset and ViweportHeight is actually what you want if UI virtualization is turned on.
Console.WriteLine("Visible Item Start Index:{0}", scrollViewer.VerticalOffset);
Console.WriteLine("Visible Item Count:{0}", scrollViewer.ViewportHeight);
};
}
}
};
你应该做的另一件事是使用ObservableCollection http://msdn.microsoft.com/en-us/library/ms668604.aspx身为你的ItemSource
而不是Array
;那肯定会提高性能 http://msdn.microsoft.com/en-us/library/aa970683%28v=vs.85%29.aspx#data_binding.
Update:
是的,这可能是真的(array
vs. ObservableCollection
)但我想看到一些与此相关的统计数据;
真正的好处是ObservableCollection
是如果您需要从您的项目中添加/删除项目ListView
在运行时,如果出现Array
你将不得不重新分配ItemSource
of ListView
和ListView
首先丢弃以前的项目并重新生成整个列表。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)