You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

UWP中GridView调用ContainerFromItem返回null问题咨询

问题

我有如下GridView控件:

<GridView 
    x:Name="gird_view" 
    Grid.Column="1" 
    ItemsSource="{x:Bind workers}"
    ContainerContentChanging="gird_view_ContainerContentChanging">
    <GridView.ItemContainerStyle>
        <Style TargetType="GridViewItem">
            <Setter Property="Margin" Value="10"/>
        </Style>
    </GridView.ItemContainerStyle>
    <GridView.ItemTemplate>
        <DataTemplate x:DataType="models:Worker">
            <local:WorkerControl ViewModel="{x:Bind}"/>
        </DataTemplate>
    </GridView.ItemTemplate>
</GridView>

我尝试了以下代码:

private async void gird_view_ContainerContentChanging(ListViewBase sender, ContainerContentChangingEventArgs args)
{
    GridViewItem item = args.ItemContainer as GridViewItem;

    await Task.Delay(5000);
    var _Container = gird_view.ContainerFromItem(item);
    if (_Container == null)
    {
        return;
    }
}

无论是否添加延迟,_Container始终返回null,请问这是什么原因?

原因及解决方法

核心问题

ContainerFromItem方法要求传入的是数据源中的数据对象(也就是你的Worker实例),但你传入的是GridViewItem容器控件本身,参数类型完全错误,所以必然返回null。

正确处理方式

  1. 直接获取容器:事件参数args.ItemContainer就是当前绑定数据对应的GridViewItem,可以直接保存引用使用,不需要额外调用查找方法。
  2. 若需使用ContainerFromItem:传入的参数应该是args.Item(数据源里的Worker对象),而不是容器控件。

修正后的代码示例

private async void gird_view_ContainerContentChanging(ListViewBase sender, ContainerContentChangingEventArgs args)
{
    GridViewItem container = args.ItemContainer as GridViewItem;
    if (container == null) return;

    await Task.Delay(5000);
    // 通过数据源对象查找容器,验证是否还存在
    var existingContainer = gird_view.ContainerFromItem(args.Item) as GridViewItem;
    if (existingContainer == null)
    {
        // 容器已被虚拟化回收(比如滚动出可视区域)
        return;
    }
    // 后续操作existingContainer
}

补充说明

  • ContainerContentChanging触发时,args.ItemContainer已经是可用状态,直接使用即可,无需重复查找。
  • 延迟后容器可能因为UI虚拟化被回收,此时即使传入正确的数据源对象,ContainerFromItem也会返回null,这是ListView/GridView的正常机制。

内容的提问来源于stack exchange,提问作者rsp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 19:22:38