【WPF】得到ListViewItem

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


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

原理:

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

示例:

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

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的各路大神说了半天都没说到点上,导致无端耗费了很多时间。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据