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

绑定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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 13:05:55