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。
正确处理方式
- 直接获取容器:事件参数
args.ItemContainer就是当前绑定数据对应的GridViewItem,可以直接保存引用使用,不需要额外调用查找方法。 - 若需使用
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
相关产品推荐
相关产品推荐

