Xamarin如何从ViewModel传递List类型Players数据供视图绑定使用
问题原因
你的代码存在两个核心问题导致无法正常绑定:
GetPlayers方法中请求到的players是局部变量,没有赋值给公开的Players属性,UI 绑定的属性一直是空值List<T>没有实现集合变更通知接口,就算数据更新了UI也收不到通知,无法自动刷新
修改方案
你只需要对PlayersViewModel.cs做如下修改即可:
- 引入
System.Collections.ObjectModel命名空间,将Players属性的类型从List<Player>改为ObservableCollection<Player>,该类型原生支持集合变更通知 - 将接口请求到的列表数据赋值给公开的
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
相关产品推荐
相关产品推荐

