ItemContainerGenerator.ContainerFromItem(item) 为null

文章讨论了ListBox控件的默认虚拟化机制,只加载可视区域的元素。当需要访问所有元素时,可以通过设置VirtualizingPanel.IsVirtualizing属性为False来禁用虚拟化。示例代码展示了如何在CheckBox点击事件中遍历ListBox项并更新CheckBox的状态,即使在虚拟化关闭的情况下。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ListBox 中有多个 ListBoxItem 元素。超出ListBox高度后,默认的虚拟化机制,使界面只加载可见范围内的元素。拖动滚动条后,再加载新的元素到界面。

如果需要,可以取消列表控件的虚拟化。 VirtualizingPanel.IsVirtualizing="False"

<ListBox Name="interestedStores" Grid.Row="2" BorderThickness="1,0,1,1"  d:ItemsSource="{d:SampleData ItemCount=5}" 
    VirtualizingPanel.IsVirtualizing="False">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Height="18">
                <CheckBox Name="chk" Content="{Binding Name}"/>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>
private void chkAll_Click(object sender, RoutedEventArgs e)
{
    foreach (var item in interestedStores.Items)
    {
        //不关闭虚拟化,这里获取不了不可见的 ListBoxItem
        var el = interestedStores.ItemContainerGenerator.ContainerFromItem(item) as ListBoxItem;
        if (el != null && el is ListBoxItem)
        {
            ListBoxItem listBoxItem = (ListBoxItem)el;
            FrameworkElement elfind = WpfHelper.FindChildByType(listBoxItem, typeof(CheckBox));

            if (elfind != null)
            {
                ((CheckBox)elfind).IsChecked = chkAll.IsChecked;
            }
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sagamaw

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值