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

.NET MAUI ListView无法渲染数据,请求排查原因

ListView无法渲染数据的可能原因及解决方法

以下是针对你的MAUI ListView不显示数据问题的几个核心排查方向和修复方案:


1. 未实现属性变更通知

你的MedicineList是普通自动属性,没有触发UI更新的机制。当构造函数中完成JSON加载并赋值时,UI无法感知到数据源的变化,自然不会渲染内容。

修复方案:改用自带变更通知的ObservableCollection<T>替代List<T>,或者让页面实现INotifyPropertyChanged接口。推荐前者,代码更简洁:

using MedicineAlert.Data;
using System.Collections.ObjectModel;
using System.Text.Json;

namespace MedicineAlert.Pages;

public partial class ListPage : ContentPage
{
    // 初始化空集合,避免null状态
    public ObservableCollection<MedicineData> MedicineList { get; set; } = new();
    public ListPage()
    {
        InitializeComponent();
        BindingContext = this; // 设置绑定上下文为自身

        string localDataDirPath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
        string dbFolderPath = Path.Combine(localDataDirPath, "DB");
        string filePath = Path.Combine(dbFolderPath, "data.json");

        if(File.Exists(filePath))
        {
            string json = File.ReadAllText(filePath);
            var loadedData = JsonSerializer.Deserialize<List<MedicineData>>(json);
            if(loadedData != null)
            {
                foreach(var item in loadedData)
                {
                    MedicineList.Add(item);
                }
            }
        }
    }
}

2. 数据源可能处于null状态

如果JSON文件不存在,你的MedicineList会保持初始null值,ListView绑定到null时不会显示任何内容。

修复方案:声明属性时直接初始化为空集合,比如上面示例中ObservableCollection的默认构造,或者普通List写成:

public List<MedicineData> MedicineList { get; set; } = new();

3. 实体类属性访问权限问题

确保MedicineData中的MedicineName是public且带有getter的属性,否则数据绑定无法读取到该值:

public class MedicineData
{
    public string MedicineName { get; set; }
    // 其他属性...
}

4. JSON反序列化失败

可能JSON文件格式与MedicineData结构不匹配,导致反序列化后得到null集合。可以添加调试代码验证:

var loadedData = JsonSerializer.Deserialize<List<MedicineData>>(json);
if(loadedData == null)
{
    // 此处添加调试输出或日志,确认反序列化失败
}

5. 绑定上下文优化

你当前使用Source={x:Reference}的绑定方式虽可行,但更简洁的方式是设置页面的BindingContext = this,然后简化XAML中的绑定:

<ListView ItemsSource="{Binding MedicineList}">
    <ListView.ItemTemplate>
        <DataTemplate>
            <TextCell Text="{Binding MedicineName}" />
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

内容的提问来源于stack exchange,提问作者Mahmud Mridul

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 10:32:48