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

MvvmCross Xamarin.iOS中API数据获取后TableView无法绑定填充问题

问题诊断与修复方案

我帮你排查了代码,发现几个关键问题导致TableView无法填充数据,下面逐个解决:

1. 服务层数据返回错误(最核心问题)

看你的SchoolNames服务的ProcessResponse方法,你已经正确反序列化得到了objects(学校列表),但最后调用success回调时传的是空的List,而不是反序列化后的objects!这直接导致ViewModel的Items永远是空的。

修复代码:

private void ProcessResponse(Action<List<SchoolModel>> success, Action<Exception> error, HttpWebRequest request, IAsyncResult result)
{
    try
    {
        var response = request.EndGetResponse(result);
        using (var stream = response.GetResponseStream())
        using (var reader = new StreamReader(stream))
        {
            var json_data = reader.ReadToEnd();
            // 不要手动替换引号,这会破坏JSON结构!直接反序列化即可
            var objects = JsonConvert.DeserializeObject<List<SchoolModel>>(json_data);
            // 这里传objects而不是空的List!
            success(objects);
        }
    }
    catch (Exception exception)
    {
        error(exception);
    }
}

另外你手动替换\"和"的操作完全没必要,Newtonsoft.Json可以直接处理带转义的JSON字符串,手动修改反而会导致反序列化失败。

2. 确认ViewModel的Start方法被调用

MvvmCross中,ViewModel的Start方法默认会在View创建时被调用,但如果你的BaseViewModel没有正确实现这个逻辑,需要确保在ViewController的ViewDidLoad里手动触发:

public override void ViewDidLoad()
{
    base.ViewDidLoad();
    this.NavigationController.SetNavigationBarHidden(true,true);
    // 手动调用ViewModel的Start方法(如果BaseViewModel没自动处理)
    ViewModel.Start();
    // ... 其他绑定代码
}

3. TableView刷新时机优化

因为数据是异步加载的,你在ViewDidLoad里调用tblSchoolSelection.ReloadData()时,数据还没返回,所以这次刷新没用。不过MvvmCross的MvxStandardTableViewSource会在绑定的Items集合变化时自动刷新TableView,你的ViewModel里已经正确触发了RaisePropertyChanged,这部分没问题。

可以在ViewModel的Items setter里加个日志,确认数据确实被赋值了:

public List<SchoolModel> Items
{
    get { return _items; }
    set 
    { 
        _items = value; 
        RaisePropertyChanged(() => Items);
        // 加日志确认数据是否更新
        System.Diagnostics.Debug.WriteLine($"Items updated, count: {_items?.Count ?? 0}");
    }
}

4. 检查SchoolModel的属性匹配

确保你的SchoolModel类的属性名称和API返回的JSON字段完全匹配(大小写敏感),如果不匹配需要用JsonProperty特性标注:

public class SchoolModel
{
    [JsonProperty("name")] // 如果API返回的是小写name
    public string Name { get; set; }
    
    [JsonProperty("apiUrl")]
    public string ApiUrl { get; set; }
}

按照上面的步骤修复后,TableView应该就能正常加载数据了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:35:30