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

Xamarin如何从ViewModel传递List类型Players数据供视图绑定使用

问题原因

你的代码存在两个核心问题导致无法正常绑定:

  1. GetPlayers 方法中请求到的 players 是局部变量,没有赋值给公开的 Players 属性,UI 绑定的属性一直是空值
  2. List<T> 没有实现集合变更通知接口,就算数据更新了UI也收不到通知,无法自动刷新

修改方案

你只需要对PlayersViewModel.cs做如下修改即可:

  1. 引入System.Collections.ObjectModel命名空间,将Players属性的类型从List<Player>改为ObservableCollection<Player>,该类型原生支持集合变更通知
  2. 将接口请求到的列表数据赋值给公开的Players属性,通过BaseViewModel封装的属性变更通知方法通知UI更新

修改后的完整代码如下:

using System.Collections.ObjectModel;

namespace App.ViewModels
{
    public class PlayersViewModel : BaseViewModel
    {
        public ICommand GetPlayersCommand { get; set; }
        private readonly string _yearDateFormat = "yyyy";

        private ObservableCollection<Player> _players = new ObservableCollection<Player>();
        public ObservableCollection<Player> Players
        {
            get => _players;
            // 若你的BaseViewModel没有封装SetProperty方法,可替换为手动触发OnPropertyChanged
            set => SetProperty(ref _players, value);
        }

        public PlayersViewModel()
        {
            Title = "Players";
            GetPlayersCommand = new Command(async () => await GetPlayers());
            GetPlayersCommand.Execute(null);
        }

        async Task GetPlayers()
        {
            IsRefreshing = true;
            List<Player> players = await ApiManager.GetPlayersAsync(DateTime.Now.ToString(_yearDateFormat));
            
            // 将请求到的数据赋值给公开属性
            Players = new ObservableCollection<Player>(players);
            
            IsRefreshing = false;
        }
    }
}

补充说明

如果你的BaseViewModel没有封装SetProperty方法,就把Players属性的set块替换为手动触发属性变更通知即可:

public ObservableCollection<Player> Players
{
    get => _players;
    set 
    {
        _players = value;
        OnPropertyChanged(nameof(Players));
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 14:06:02