如何仅使用其数据绑定类从 ListBoxItem 访问按钮/标签?

Posted

技术标签:

【中文标题】如何仅使用其数据绑定类从 ListBoxItem 访问按钮/标签?【英文标题】:How I can get access to a button / label from a ListBoxItem with just its databinding class? 【发布时间】:2021-06-08 20:46:33 【问题描述】:

我目前有一个绑定到列表框项的类对象。以前我通过单击按钮并访问其父级来获取 ListBoxItem 中的其他对象,但现在我需要在不单击按钮或标签的情况下仅按其类来收集对象。

我试图收集 ListBoxItem 及其索引和类绑定,但它们都给了我一个 null 值:

ObservableCollection<ClassBinding> classList = new ObservableCollection<ClassBinding>();
... adding items here to the collection;
listBox.ItemsSource = classList;
ListBoxItem lbi = (ListBoxItem)listBox.ItemContainerGenerator.ContainerFromIndex(index);

还有其他方法可以访问列表框项,以便稍后使用函数FindName(...) 收集其他对象吗?

调试:

TextBlock delay = lbi.FindName("lblDelay") as TextBlock;

错误:

Output: Exception thrown: 'System.InvalidOperationException' in WindowsBase.dll

【问题讨论】:

你知道你可以为你的列表框绑定选定的项目,从而删除所有这些代码。一个更紧迫的问题是你为什么不使用绑定?向我们展示您的 xaml,我们可以提供更多帮助。 我认为您在转换中的某个地方是错误的。使用标签延迟 = lbi.FindName("lblDelay") 作为标签; @meysamasadi 它是一个文本块。任何人我都会添加更多信息。 如果可以导入ClassBinding类内容,可能会发现bug。 【参考方案1】:

ListBox 默认是虚拟化的,参见Displaying large data sets。

通常,您不必同时显示所有项目;相反,您显示一个子集,并且用户滚动列表。在这种情况下,使用 UI 虚拟化是有意义的,这意味着项目容器的生成和关联的布局计算将推迟到项目可见为止。

换句话说,你得到null,因为有问题的ListBoxItem 还不可见和实现。解决此问题的唯一可靠方法是禁用虚拟化以强制实例化所有项目。虽然您随后可以访问每个项目,但这可能会导致大型集合的性能下降,因为在加载 ListBox 时会加载所有项目,并且所有项目都保存在内存中,这会增加内存占用。

<ListBox x:Name="listBox" VirtualizingStackPanel.IsVirtualizing="False">

访问子控件,例如在具有FindName(...) 的名称的数据模板中,在ItemsControls 中不起作用,如ListBox。您必须遍历可视化树才能获得控件,请参阅:

How can I find WPF controls by name or type?。

一般来说,直接处理项目控件中的控件并不是一个好主意。使用数据绑定要容易得多,因为您不会直接访问容器和虚拟化,因此您不会遇到任何问题。此外,您的代码将被简化,您无需假设视觉结构。

有关此主题的更多信息和示例,您可以参考:

How to: Bind to a Collection and Display Information Based on Selection Data binding overview (WPF .NET) Data Templating Overview WPF Databinding With A Collection Object

【讨论】:

【参考方案2】:

为了找到另一个解决方案/想法,我想出了可以添加到类中的 INotifyPropertyChanged,因此无需从列表框中删除 ItemsSource,只需在加载项时挂钩项目源程序,然后您可以更改集合内的数据。

我使用了这里的代码:INotifyPropertyChanged and ObservableCollection WPF

我不需要访问文本块,只需将一些绑定绑定到对象,并且能够通过更改类的值来更改 UI。

【讨论】:

以上是关于如何仅使用其数据绑定类从 ListBoxItem 访问按钮/标签?的主要内容,如果未能解决你的问题,请参考以下文章

在加载时动画ListBoxItem

根据数据库中的某些数据绑定listboxitem的背景颜色

如何将 WPF ListBoxItem 的 IsEnabled 属性绑定到其源项的属性?

ListBoxItem 与 ListViewItem 的 GridViewColumn 绑定

获取 ListBoxItem 的索引 - WPF

获取ListBox中的ListBoxItem