我使用以下DataTemplate创建了一个CheckedListBox控件:
<WrapPanel>
<CheckBox x:Name="CheckBox" VerticalAlignment="Center"
<ContentPresenter Content="{Binding}" Margin="5,2" />
</WrapPanel>
我是codebehind我需要访问属于ListBoxItem的CheckBox:
foreach (var value in Items)
{
var item = ItemContainerGenerator.ContainerFromItem(value) as ListBoxItem;
var checkBox = item?.GetVisualChildren<CheckBox>().FirstOrDefault();
}
public static IEnumerable<T> GetVisualChildren<T>(this DependencyObject depObj) where T : DependencyObject
{
if (depObj != null)
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
if (child != null && child is T)
{
yield return (T)child;
}
foreach (T childOfChild in GetVisualChildren<T>(child))
{
yield return childOfChild;
}
}
}
}
问题在于,当我的列表框包含很多项目时,如果没有滚动条,它们都无法显示,那么GetVisualChildren
将为可见部分之外的项目返回null。如果尚未渲染控件,则同样适用于所有项目。无论项目的呈现状态如何,如何更改此代码以始终访问ListBoxItem的CheckBox?我尝试了可视化树,逻辑树FindName,但没有找到解决方案。
答案 0 :(得分:1)
您可以尝试将仅保留可见项目的VirtualizingStackPanel更改为简单StackPanel作为ItemsPanel。如果性能不是很关键并且不会有很多项目,这应该会有所帮助:
MyComponent