如何仅使用其数据绑定类从 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(...)
的名称的数据模板中,在ItemsControl
s 中不起作用,如ListBox
。您必须遍历可视化树才能获得控件,请参阅:
一般来说,直接处理项目控件中的控件并不是一个好主意。使用数据绑定要容易得多,因为您不会直接访问容器和虚拟化,因此您不会遇到任何问题。此外,您的代码将被简化,您无需假设视觉结构。
有关此主题的更多信息和示例,您可以参考:
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 访问按钮/标签?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 WPF ListBoxItem 的 IsEnabled 属性绑定到其源项的属性?