WPF ItemContainerGenerator.ContainerFromItem返回Null
问题描述:出现一组数据超过10行就会返回null,数据量条数少于10行没问题
解决过程:
通过查看这篇博客发现可能跟虚拟化容器有关:
https://blog.csdn.net/u013002790/article/details/78210551
解决办法:
1、设置ListView属性VirtualizingStackPanel.VirtualizationMode=“Standard”
VirtualizingStackPanel.IsVirtualizing=“False”
2、动态设置:如果后台代码返回null,例如, lsvTrays.UpdateLayout();
var lv = lsvTrays.ItemContainerGenerator.ContainerFromItem(t) as ListViewItem;
那么在这行代码之前加入一句:lsvTrays.UpdateLayout()
动态使 等于A类变成 绿色字体
private void StatusChanged(object sender, EventArgs e)
{
if (lsvTrays.ItemContainerGenerator.Status == System.Windows.Controls.Primitives.GeneratorStatus.ContainersGenerated)
{
foreach (TraysnInfo t in lsvTrays.Items)
{
lsvTrays.UpdateLayout();
var lv = lsvTrays.ItemContainerGenerator.ContainerFromItem(t) as ListViewItem;
foreach (string n in nums)
{
if (t.LineNum == n)
{
lv.Foreground = Brushes.Green;
}
}
}
}
}
使其颜色变换的函数调用方式:
lsvTrays.ItemContainerGenerator.StatusChanged += new EventHandler(StatusChanged);
补充参考这篇博文:
https://www.cnblogs.com/jasenkin/archive/2011/08/22/listview_virtual_model.html 如果数据量大的时候开启虚拟化模式
Winform ListView虚拟模式
一、前言
虚拟模式在许多情况下都很有用。 如果必须从已存在于内存中的非常大的集合填充一个 ListView 对象,则为每项创建一个 ListViewItem 对象会很浪费。 在虚拟模式下,从缓冲之中获取所需的数据进行加载,性能会有很大提高。 在其他情况下,可能需要经常重新计算 ListViewItem 对象的值,对整个集合进行此操作将产生不可接受的性能。
如下为虚拟模式的一