2017-08-15 87 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

完美工作。不能相信我沒有考慮到這一點。非常感謝。 –