拉动刷新只执行一次命令

Pull to Refresh executing the Command only once

我在互联网上搜索了最有可能是简单解决方案的方法,但 none 似乎遇到了与我相同的问题。

所以简单解释一下,我正在使用 Xamarin Forms 并且我有一个 ListView:

<ListView x:Name="kpiList" 
          Style="{StaticResource customList}" 
          HasUnevenRows="true" 
          SeparatorVisibility="None" 
          IsPullToRefreshEnabled="true" 
          Grid.Row="1" 
          Grid.Column="0" 
          Grid.ColumnSpan="3">
</ListView>

我这样定义它的 RefreshCommand 和 IsRefreshing 属性:

public partial class MainPage : ContentPage
{
    bool _isRefreshing = false;
    public bool IsRefreshing
    {
        get { return _isRefreshing; }
        set
        {
            _isRefreshing = value;
            OnPropertyChanged(nameof(IsRefreshing));
        }
    }

    public ICommand RefreshData;

    public MainPage()
    {
        RefreshData = new Command(RepopulateList);

        kpiList.RefreshCommand = RefreshData;
        kpiList.IsRefreshing = IsRefreshing;
    {

    void RepopulateList()
    {
        IsRefreshing = true;

        Controller.KPIs.Clear();
        foreach (KPIObj kpi in await 
        WebServices.GetUpdatedKPI(Controller.SavedKPIIds))
        {
            Controller.KPIs.Add(kpi);
        }

        IsRefreshing = false;
    }
}

奇怪的是,我第一次拉动刷新时效果很好。但是我第二次尝试时,它从未进入命令设置的代码块。

几乎就好像ListView "loses"第一次拉动刷新后指向命令的指针

要使其正常工作,您只需更改此:

kpiList.IsRefreshing = IsRefreshing;

来自

kpiList.SetBinding(ListView.IsRefreshingProperty, nameof(IsRefreshing));

在第一个中,您仅将页面 属性 的 IsRefreshing 的值分配给 ListViewIsRefreshing 属性。省略了任何更改(如您所见)。

注意: 如果您在 XAML 中进行绑定,它也应该有效,但您还需要在构造函数中设置 BindingContext MainPage.

希望对您有所帮助。-