绑定ObservableCollection时自定义ListViewItem DataTemplate遇灾难性故障
解决ListView自定义ItemTemplate后抛出E_UNEXPECTED异常的问题
针对设置ItemTemplate后出现Catastrophic failure (Exception from HRESULT: 0x8000FFFF (E_UNEXPECTED))异常的问题,给出以下排查和解决方向:
1. 移除冲突的DisplayMemberPath属性
你的ListView同时设置了DisplayMemberPath="Name"和自定义ItemTemplate,这两个属性互斥——DisplayMemberPath会指定默认文本显示逻辑,ItemTemplate则是完全自定义的模板,同时存在会触发绑定逻辑冲突,这是该异常的常见诱因。
修改后的ListView代码:
<ListView Margin="12" IsItemClickEnabled="True" SelectedItem="{x:Bind ViewModel.SelectedFile, Mode=TwoWay}" ItemsSource="{x:Bind ViewModel.Files}" SelectionMode="Single"> <ListView.ItemTemplate> <DataTemplate x:DataType="vms:FileViewModel"> <StackPanel Orientation="Vertical"> <TextBlock Text="File Name" Margin="5"/> </StackPanel> </DataTemplate> </ListView.ItemTemplate> </ListView>
2. 验证x:DataType的命名空间声明
确认XAML头部已正确声明vms命名空间,指向FileViewModel所在的程序集和命名空间,示例:
xmlns:vms="clr-namespace:YourApp.ViewModels;assembly=YourApp"
若命名空间声明错误,XAML无法解析FileViewModel类型,会导致模板加载失败抛出异常。
3. 检查FileViewModel的定义
确保FileViewModel是公共类,后续需要绑定的属性也需保持公共可访问权限。即便当前模板仅显示固定文本,类本身的访问权限问题也可能引发模板解析异常。
4. 确认集合操作在UI线程执行
尽管改为非异步后问题依旧,仍需确认向Files集合添加项的操作是否在UI线程执行。在UWP/WPF中,ObservableCollection的修改必须在UI线程,可尝试用Dispatcher包装添加逻辑:
// UWP示例 foreach (var model in await store.GetAllAsync()) { await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { Files.Add(new FileViewModel(model.Id, model.OriginalPath, model.ConvertedTypes, model.FileSize)); }); } // WPF示例 foreach (var model in await store.GetAllAsync()) { Application.Current.Dispatcher.Invoke(() => { Files.Add(new FileViewModel(model.Id, model.OriginalPath, model.ConvertedTypes, model.FileSize)); }); }
内容的提问来源于stack exchange,提问作者Shameel Mohamed
相关产品推荐
相关产品推荐

