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

.NET MAUI ListView IsRefreshing绑定失效及RefreshCommand无法触发问题

.NET MAUI ListView下拉刷新绑定问题解决方案

问题核心原因

  1. ListRefreshing是字段而非属性:XAML数据绑定仅支持绑定公共属性,字段无法被绑定系统识别,因此出现「'ListRefreshing' property not found」警告。
  2. RefreshCommand未定义为属性:虽然部分场景下字段能触发绑定,但不符合MVVM绑定规范,是命令未触发的关键原因。
  3. 属性变更未通知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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 23:10:25