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

.NET MAUI中HttpClient.GetAsync调用Rest服务无法显示数据问题

.NET MAUI Azure REST 数据绑定不显示问题解决方法

核心问题分析

你的代码存在三个关键问题导致UI无法更新:

  1. Archer类未实现INotifyPropertyChanged:属性变更无法通知UI刷新
  2. ViewModel未在UI线程更新数据:ConfigureAwait(false)导致后续代码脱离UI线程,更新操作无效
  3. 未将获取到的云端数据同步到绑定的集合对象中:仅获取数据但未更新绑定的currentArcher属性

步骤1:修改Archer类实现属性变更通知

确保每个属性变更时能触发UI更新:

using System.ComponentModel;
using System.Runtime.CompilerServices;

public class Archer : INotifyPropertyChanged
{
    private string _firstName;
    public string FirstName
    {
        get => _firstName;
        set
        {
            if (_firstName != value)
            {
                _firstName = value;
                OnPropertyChanged();
            }
        }
    }

    private string _middleName;
    public string MiddleName
    {
        get => _middleName;
        set
        {
            if (_middleName != value)
            {
                _middleName = value;
                OnPropertyChanged();
            }
        }
    }

    // 以下LastName、DateOfBirth、Email、ArcherID等属性均按上述格式实现

    public event PropertyChangedEventHandler PropertyChanged;
    void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

步骤2:重构ViewModel,正确加载并更新数据

将数据加载逻辑移入ViewModel,并确保UI线程更新:

using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Text.Json;
using Microsoft.Maui.Controls;

namespace DRSMain.ViewModels
{
    public class RegisterArcherViewModel : INotifyPropertyChanged
    {
        private Archer _currentArcher;
        private ObservableCollection<Archer> _archers;
        private readonly IRestHandler _restHandler;

        public ObservableCollection<Archer> archers
        {
            get => _archers;
            private set
            {
                _archers = value;
                OnPropertyChanged();
            }
        }

        public RegisterArcherViewModel(string anArcherID, IRestHandler restHandler)
        {
            _restHandler = restHandler;
            _currentArcher = new Archer();
            
            if (!string.IsNullOrEmpty(anArcherID))
            {
                _currentArcher.ArcherID = anArcherID;
                LoadArcherData(anArcherID);
            }

            _archers = new ObservableCollection<Archer> { _currentArcher };
        }

        private async void LoadArcherData(string archerId)
        {
            try
            {
                var uri = new Uri($"你的Azure函数API地址/{archerId}"); // 替换为实际API地址
                var response = await _restHandler.myClient.GetAsync(uri).ConfigureAwait(false);
                response.EnsureSuccessStatusCode();
                
                var content = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
                // 启用大小写不敏感反序列化,避免字段名匹配问题
                var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true };
                var items = JsonSerializer.Deserialize<List<ProtoArcher>>(content, options);

                if (items?.Count == 1)
                {
                    var protoArcher = items[0];
                    // 切换回UI线程更新属性
                    await Application.Current.Dispatcher.DispatchAsync(() =>
                    {
                        _currentArcher.FirstName = protoArcher.FirstName;
                        _currentArcher.MiddleName = protoArcher.MiddleName;
                        _currentArcher.LastName = protoArcher.LastName;
                        _currentArcher.DateOfBirth = protoArcher.DateOfBirth;
                        _currentArcher.Email = protoArcher.Email;
                        // 同步其他需要显示的属性
                    });
                }
            }
            catch (Exception ex)
            {
                Debug.WriteLine(@"\tError {0}", ex.Message);
            }
        }

        #region INotifyPropertyChanged
        public event PropertyChangedEventHandler PropertyChanged;

        void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
        #endregion
    }
}

步骤3:确保页面BindingContext正确设置

在RegisterArcher页面构造函数中绑定ViewModel:

public RegisterArcher(string archerId, IRestHandler restHandler)
{
    InitializeComponent();
    BindingContext = new RegisterArcherViewModel(archerId, restHandler);
}

额外排查点

  • 确认Azure函数返回的JSON字段名与Archer类属性名一致(或通过JsonSerializerOptions忽略大小写)
  • 检查API返回数据是否存在空值,可在调试中查看protoArcher的属性值
  • 确保IRestHandler的myClient已正确配置(如BaseAddress、超时等)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 12:00:55