2017-08-15 92 views
2

我已经搜索了互联网最可能是一个简单的解决方案,但似乎没有像我一样的问题。拉到刷新执行命令只有一次

所以简单介绍一下它,我使用Xamarin形式,我有一个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; 
    } 
} 

奇怪的是我第一次刷新它的效果非常好。但是,我第二次尝试时,它永远不会进入Command设置的代码块。

就好像ListView在第一次拉动刷新后“丢失”指向该命令的指针。

+0

(对不起,我PORR英文)每次调用您的刷新命令返回命令的diferent例如,根据你的代码。我想这是错误。你应该只返回它的一个实例......我建议你改变你的命令定义,将其设置为一个分离的方法,并将其设置在构造函数 –

+0

为了确保这一点,请将方法体包围在try块中并提醒异常。我想这是抛出一个异常无处 –

+0

感谢Diego的建议,我试过你的想法,它似乎仍然做同样的事情。没有错误被抛出。 –

回答

1

为了使它工作,你只需要改变这一点:

kpiList.IsRefreshing = IsRefreshing; 

通过

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

在第一个,你只分配你的页面属性IsRefreshing的价值的IsRefreshing财产的ListView。任何更改都被省略(如您注意到的)。

注:如果做在XAML它应该也具有约束力,但你还需要设置BindingContextMainPage的构造。

希望这helps.-

+0

完美工作。不能相信我没有考虑到这一点。非常感谢。 –