0%

【WPF】得到ListViewItem

由于绑定了数据的原因,得到数据当然方便了许多,直接遍历就可以了,但是要是对其中一项的外观进行改变就麻烦了,找了很长时间依旧无果。后来偶然找到了一种方法就是使用ItemContainerGenerator得到ListViewItem,但是又一直返回空值,又翻了翻,终于找到了解决方法:就是使用UpdateLayout()ScrollIntoView(data)定位数据!

这个方法好像对ListBox无效,因为其没有ScrollIntoView()方法,Ummm,一概使用ListView替代吧。

原理:

ListView的ItemContainerGenerator.ContainerFromItem()方法无法直接获得ListViewItem,它需要定位数据的位置。如果需要获得的项目在当前页面,也就是在不需要滚动就能找到的位置,那么需要在之前使用ListView的UpdateLayout()方法刷新当前页面,如果需要获得的项目不在当前页面,也就是在需要滚动才能找到的位置,那么需要使用ListView的ScrollIntoView(data)方法滚动到那里。 综合来说,如果是需要查询数据的位置,即不知道数据出现在哪,就先刷新当前页面看看项目是不是在当前页面,如果依然返回null,就滚动到那里获得。

示例:

下面是对于任意类型(用泛型TData代替)数据从ListView中提取出ListViewItem的方法

1
2
3
4
5
6
7
8
9
10
11
ListViewItem GetItem<TData>(ListView lv,TData data)
{
lv.UpdateLayout();
ListViewItem item = lv.ItemContainerGenerator.ContainerFromItem(data) as ListViewItem;
if (item == null
{
lv.ScrollIntoView(data);
item = lv.ItemContainerGenerator.ContainerFromItem(data) as ListViewItem;
}
return item;
}

Aha,这样就可以跳过数据了! CSDN的各路大神说了半天都没说到点上,导致无端耗费了很多时间。