.NET MAUI ListView IsRefreshing绑定失效及RefreshCommand无法触发问题
.NET MAUI ListView下拉刷新绑定问题解决方案
问题核心原因
ListRefreshing是字段而非属性:XAML数据绑定仅支持绑定公共属性,字段无法被绑定系统识别,因此出现「'ListRefreshing' property not found」警告。RefreshCommand未定义为属性:虽然部分场景下字段能触发绑定,但不符合MVVM绑定规范,是命令未触发的关键原因。- 属性变更未通知UI:原代码中
ListRefreshing的修改不会触发PropertyChanged事件,UI无法感知刷新状态变化。
修正后的ViewModel代码
using System.Collections.ObjectModel; using System.Diagnostics; using System.Windows.Input; using CommunityToolkit.Mvvm.ComponentModel; using FireLearn.Models; namespace FireLearn.ViewModels { class CategoryViewModel : ObservableObject { public ObservableCollection<CategoryModel> categories = new ObservableCollection<CategoryModel>(); public ObservableCollection<CategoryModel> Categories { get => categories; set => SetProperty(ref categories, value); } // 改为属性并使用SetProperty触发通知 private bool _listRefreshing; public bool ListRefreshing { get => _listRefreshing; set => SetProperty(ref _listRefreshing, value); } // 将命令定义为公共属性 public ICommand RefreshCommand { get; } public CategoryViewModel() { // 异步初始化,避免构造函数直接调用异步方法的警告 _ = InitializeAsync(); // 初始化刷新命令 RefreshCommand = new Command(async () => { if (!ListRefreshing) { ListRefreshing = true; try { await loadFromSource(); } finally { ListRefreshing = false; } } }); } private async Task InitializeAsync() { await loadFromSource(); } public async Task loadFromSource() { HttpClient httpClient = new() { Timeout = new TimeSpan(0,0,10) }; Uri uri = new Uri("https://somewodpresssite/wp-json/wp/v2/categories"); HttpResponseMessage msg = await httpClient.GetAsync(uri); if (msg.IsSuccessStatusCode) { var result = CategoryModel.FromJson(await msg.Content.ReadAsStringAsync()); Categories = new ObservableCollection<CategoryModel>(result); } Debug.WriteLine("List Refreshed"); } } }
关键修改说明
ListRefreshing改为属性:使用私有字段+公共属性的结构,通过SetProperty方法更新值,自动触发PropertyChanged事件,让UI实时感知刷新状态。RefreshCommand改为属性:定义为公共get-only属性,符合MVVM绑定规范,确保XAML能正确识别并触发命令。- 异步初始化优化:新增
InitializeAsync方法处理初始数据加载,避免构造函数直接调用异步方法的编译警告,同时保证初始数据加载的正确性。
XAML代码无需修改,保持原有绑定即可,修正后下拉刷新命令会正常触发,刷新状态也会正确同步到UI。
内容的提问来源于stack exchange,提问作者Gavin Beard
相关产品推荐
相关产品推荐

