RefreshView 的状态正在调用 .NET MAUI 中的 RefreshCommand

Sam*_*Sam 4 xamarin xamarin.forms maui .net-maui

我的 .NET MAUI 应用程序中有一个CollectionView,我将其放置在 .NET MAUI 应用程序中RefreshView。当我调用 API 来填充 this 时CollectionView,我会缓存数据,这样我就不必在每次用户点击此页面时继续进行 API 调用。

为了简化我的代码,我private在视图模型中创建了一个调用 API 的方法。视图模型如下所示:

public partial MyViewModel : BaseViewModel
{
   ObservableCollection<MyModel> MyData { get; } = new();

   [RelayCommand]
   async Task RefreshData()
   {
      IsBusy = true;

      await GetData(true);

      IsBusy = false;
   }

   private async Task GetData(bool shouldGetFreshData)
   {
       // Makes API call to get data, then assigns it to MyData collection
   }

   public async void Init()
   {
       IsBusy = true;

       await GetData(false);
 
       IsBusy = false;
   }
}
Run Code Online (Sandbox Code Playgroud)

该页面的 XAML 如下所示:

<RefreshView
   IsRefreshing={Binding IsBusy}
   Command={Binding RefreshDataCommand}>
   <CollectionView>
   ...
   </CollectionView>
</RefreshView>
Run Code Online (Sandbox Code Playgroud)

我还连接了页面以使用MyViewModel作为其视图模型并且OnAppearing(),我调用Init()视图模型的方法。

这是我所期待的,但没有发生:

我想,Init()首先会调用 ,然后调用GetData()带有false输入参数的方法。这样,我就可以使用缓存的数据。每当用户CollectionView通过下拉刷新该方法时,RefreshData()都会以输入参数的形式调用该方法true,这将强制代码进行 API 调用。

与我预期的不同的是,发生了以下情况:

  1. Init()方法首先被调用,因此, with 行IsBusy = true被执行。
  2. 然后最终调用该RefreshData()方法
  3. 然后执行await GetData(false)in方法Init()
  4. 然后执行await GetData(true)in方法RefreshData()

所有这些的结果是,该GetData()方法被调用两次。

我想,引发这一切的原因是IsBusy。我认为IsBusy只能作为一个指示器,但不一定调用RefreshData()绑定到Command我的 的方法RefreshView

这是正常行为还是我在这里遗漏了一些东西?

Sam*_*Sam 6

显然,这是“正常”行为,因为我手动设置IsBusytrue. 我决定把这个问题留在这里,因为这可能是一个影响其他人的陷阱。

这是文档中说明这一点的实际部分: 在此输入图像描述

这是文档: https: //learn.microsoft.com/en-us/dotnet/maui/user-interface/controls/refreshview

所以,我所要做的就是删除IsBusy = trueinInit()方法。