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

UWP中使用x:Bind绑定ListView至AssignmentList时出现异常崩溃问题

UWP中使用x:Bind绑定ListView至AssignmentList时出现异常崩溃问题

看起来你遇到的是UWP中x:Bind强类型绑定的常见类型不匹配问题,我帮你分析下核心原因和解决办法:

核心问题分析

从你提供的代码来看,有两个最可能导致崩溃的问题:

  1. 重复定义了Assignment类:
    你在YourApp.Pages命名空间下又定义了一个Assignment类,但同时代码中引用了YourApp.Classes命名空间,而且Refresh方法反序列化得到的是Classes下的Assignment实例。这就导致ObservableCollection<Assignment>(当前命名空间下的类型)和实际添加的Classes.Assignment类型不兼容,绑定的时候直接抛出类型不匹配的异常。

  2. XAML中x:DataType的命名空间错误:
    即使你想使用Pages下的Assignment,反序列化的对象却是Classes下的,类型完全不匹配;如果Assignment本该在Classes中,那你XAML里用local:Assignment(local指向Pages)也会导致x:Bind无法找到正确的类型。


具体解决步骤

1. 清理重复的Assignment类

删除Assignments.xaml.cs中YourApp.Pages命名空间下的Assignment类定义,确保Assignment只在YourApp.Classes中存在,类代码如下:

// YourApp.Classes/Assignment.cs
namespace YourApp.Classes
{
    public class Assignment
    {
        public string Author { get; set; }
        public string Id { get; set; }
        public string Name { get; set; }
        public string Topic { get; set; }
        public string Snippet { get; set; }
        public string Time { get; set; }
        public int Cases { get; set; }
    }
}

2. 修正XAML的命名空间与x:DataType

添加指向YourApp.Classes的命名空间,确保DataTemplate能找到正确的Assignment类型:

<Page x:Class="YourApp.Pages.Assignments"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:local="using:YourApp.Pages"
      xmlns:classes="using:YourApp.Classes" <!-- 新增指向Classes的命名空间 -->
      mc:Ignorable="d">

    <Grid Padding="25">
        <TextBlock Style="{ThemeResource TitleTextBlockStyle}" Text="Assignments"/>
        <ListView x:Name="ListView_Assignments" 
                  ItemsSource="{x:Bind AssignmentList}"
                  Loaded="ListView_Assignments_Loaded">
            <ListView.ItemTemplate>
                <!-- 改为classes命名空间下的Assignment类型 -->
                <DataTemplate x:DataType="classes:Assignment">
                    <StackPanel Margin="8">
                        <TextBlock Text="{x:Bind Name}"/>
                    </StackPanel>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </Grid>
</Page>

3. 修正后台代码的类型一致性

确保Assignments.xaml.cs中所有Assignment引用都指向YourApp.Classes,并保留正确的ObservableCollection定义:

using YourApp.Classes;
using Newtonsoft.Json;
using System.Collections.ObjectModel;
using System.Collections.Generic;
using System.Threading.Tasks;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;

namespace YourApp.Pages
{
    public sealed partial class Assignments : Page
    {
        public ObservableCollection<Assignment> AssignmentList { get; } = new ObservableCollection<Assignment>();

        public Assignments()
        {
            this.InitializeComponent();
        }

        async Task Refresh()
        {
            string result = await Data.HttpPost("/assignments/get", "");
            List<Assignment> list = JsonConvert.DeserializeObject<List<Assignment>>(result);
            AssignmentList.Clear();
            if (list != null)
            {
                foreach (Assignment item in list)
                    AssignmentList.Add(item);
            }
        }

        async void ListView_Assignments_Loaded(object sender, RoutedEventArgs e)
        {
            try
            {
                await Refresh();
            }
            catch (Exception ex)
            {
                // 可以添加异常捕获,方便排查后续问题
            }
        }
    }
}

额外的最佳实践建议

  • 避免在事件处理中使用async void(虽然允许),如果Refresh抛出异常会难以捕获,建议在方法内添加try-catch块。
  • 确保ObservableCollection的操作都在UI线程执行:你的代码中await会自动捕获UI上下文,所以AssignmentList.Add是安全的,无需额外处理。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 11:35:32