【问题标题】:wpf listviewitem returning null when initialized [duplicate]wpf listviewitem在初始化时返回null [重复]
【发布时间】:2023-04-02 11:07:01
【问题描述】:

这个问题似乎应该有一个非常简单的答案,但我似乎无法弄清楚我的程序中发生了什么。

我有一个使用ListView 的C# WPF 应用程序。 ListView 有几个项目,我通过这样做添加到其中

myListView.Items.Add("one");
myListView.Items.Add("two");

现在我尝试访问ListView 中的第二个ListViewItem。

ListViewItem item = myListView.Items[myListView.Items.Count - 1] as ListViewItem;

发生的错误是 myListViewItem item 为 null 并且未重新调整 ListViewItem。

我注意到当我输入下面的代码时,我的var item 正在返回一个值为“two”的字符串。所以我不明白为什么我无法以ListViewItem 的身份访问该对象。

var item = clv_TraceGroups.Items[clv_TraceGroups.Items.Count - 1];

【问题讨论】:

  • 当您向 Items 集合添加字符串时,它不会神奇地包含 ListViewItems。为什么你想要得到一个 ListViewItem,而不仅仅是你添加的项目字符串?
  • 我想获取 ListViewItem,因为我的 ListView 有一个带有复选框的项目模板,我想将特定 ListViewItem 的 checkbox.IsChecked 属性设置为 true。
  • 您应该将 ListView 的 ItemsSource 绑定到具有字符串和 bool 属性的对象集合。在 ItemTemplate 中,将 CheckBox 绑定到 bool 项属性。通过 ItemContainerGenerator 访问 ListViewItems 是一个 hacky 解决方案,因为实际上应该通过将数据绑定到适当的视图模型来完成。

标签: c# wpf listview listviewitem


【解决方案1】:

myListView.Items[myListView.Items.Count - 1] 返回一个string,即您添加到Items 集合中的实际项目。

您可以使用ItemContainerGenerator 获得对此项的ListViewItem 容器的引用:

ListViewItem item = myListView.ItemContainerGenerator.ContainerFromIndex(myListView.Items.Count - 1) as ListViewItem;

请注意,如果您在 ListView 中有很多项目,并且您试图获取对某个项目的容器的引用,但由于性能原因而该项目已被虚拟化,则此方法将不起作用。

您可能应该问自己为什么需要对 ListViewItem 容器的引用。可能有更好的方法来解决您正在尝试做的任何事情。

【讨论】:

  • 我发现当我尝试时:myListView.Items.Add("one"); myListView.Items.Add("two"); ListViewItem item = myListView.ItemContainerGenerator.ContainerFromIndex(myListView.Items.Count - 1) as ListViewItem; 项目变量仍然为空。我要做的就是将项目添加到 ListView,然后等待 ItemContainerGenerator_StatusChanged 更改为 Generated,然后在该事件处理程序中对 ListBoxItem 执行我想要执行的操作。
  • 是的,必须先创建容器,然后才能获得对它的引用。
猜你喜欢
  • 1970-01-01
  • 2013-02-10
  • 1970-01-01
  • 2020-03-26
  • 2017-05-19
  • 1970-01-01
  • 1970-01-01
  • 2019-01-22
  • 2012-04-16
相关资源
最近更新 更多