MAUI绑定ObservableCollection<string>到ListView导航时抛出COMException
问题根因
抛出0x88000FA8 WinRT COM异常的核心原因是页面内ListView配置错误叠加XAML逻辑冲突,异常栈指向Shell导航相关代码只是表层抛出位置,并非导航逻辑本身问题:
- ListView绑定属性用错:将数据源集合赋值给了
BindingContext而非ItemsSource属性,ListView无法正确识别数据源,触发WinUI端布局计算异常。 - XAML中重复声明ViewModel:XAML内通过无参构造函数创建了
CollectionItemDetailsViewModel实例,该实例未传入item参数,Item属性为null,初始化阶段所有绑定Item.xxx的属性都会触发空引用错误,后续后台代码覆盖BindingContext时已经进入布局流程,错误已经产生。 - 布局嵌套冲突:ListView被放置在无固定高度的垂直StackLayout中,外层FlexLayout设置了
VerticalOptions="Fill",WinUI平台下ListView默认会尝试占满全部可用高度,嵌套在无限高度容器中会触发布局死循环,最终导致Shell导航完成后更新NavigationView属性时抛出异常。这也是移除ListView后异常消失的直接原因。
修复步骤
- 删除XAML中冗余的BindingContext声明,避免创建无参数的空ViewModel实例,移除以下代码块:
<ContentPage.BindingContext> <ViewModels:CollectionItemDetailsViewModel/> </ContentPage.BindingContext>
后台代码Init方法中已经手动赋值了传入正确item参数的ViewModel实例,XAML中的无参构造实例完全多余。
- 修正XAML中的命名空间声明错误,原代码中ViewModels命名空间声明少了必要的冒号,同程序集下正确写法为:
xmlns:ViewModels="clr-namespace:ViewModels"
如果ViewModels所在命名空间和当前页面不在同一程序集,还需要追加;assembly=你的程序集名称后缀。
- 修正ListView的绑定方式与布局约束,将绑定属性从
BindingContext改为ItemsSource,同时给ListView设置固定高度避免布局循环,替换为以下代码:
<ListView ItemsSource="{Binding Publishers}" HeightRequest="200"> <ListView.ItemTemplate> <DataTemplate> <TextCell Text="{Binding}"/> </DataTemplate> </ListView.ItemTemplate> </ListView>
- 可选优化:如果仅需要展示简单的字符串列表,不需要ListView的选中、滚动交互等复杂功能,推荐使用
BindableLayout附加属性绑定普通布局容器,重量更轻且不会出现高度约束冲突,示例代码:
<VerticalStackLayout BindableLayout.ItemsSource="{Binding Publishers}" HeightRequest="200"> <BindableLayout.ItemTemplate> <DataTemplate> <Label Text="{Binding}" FontSize="Small" Margin="0,2"/> </DataTemplate> </BindableLayout.ItemTemplate> </VerticalStackLayout>
补充说明
将IList<string>转换为ObservableCollection<string>和异常本身无关,由于页面不需要监听集合变更,直接绑定原IList类型的Item.Publishers属性也可正常运行,无需额外做类型转换。
内容的提问来源于stack exchange,提问作者Justiciar
相关产品推荐
相关产品推荐

