2017-08-15 6 views
2

J'ai parcouru Internet pour trouver ce qui serait probablement une solution simple, mais aucun ne semblait avoir eu le même problème que moi.Tirer pour rafraîchir l'exécution de la commande une seule fois

Donc, pour l'expliquer brièvement, je l'aide des formulaires Xamarin et j'ai ListView:

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

Je PRIS RefreshCommand et les propriétés IsRefreshing comme ceci:

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; 
    } 
} 

La chose étrange est que la première fois que je tire pour le rafraîchir fonctionne parfaitement bien. Mais la seconde fois que j'essaie, il n'entre jamais dans le bloc de code que la commande est définie. C'est presque comme si ListView "perd" le pointeur de la commande après le premier tirage à rafraichir.

+0

(Désolé pour le porr anglais) Chaque appel à votre commande de rafraîchissement retourne une instance diferent de commandement, selon votre code. Je suppose que c'est l'erreur. Vous devriez retourner une seule instance ... Je vous suggère de changer votre définition de commande pour la définir comme une méthode séparée et de la définir sur le constructeur –

+0

Pour être sûr de cela, entourez votre corps de méthode dans un bloc try et alertez l'exception . Je suppose que c'est une exception nulle part –

+0

Merci pour la suggestion de Diego, j'ai essayé ce que vous pensiez et il semble que ça fasse toujours la même chose. Aucune erreur n'est levée. –

Répondre

1

Pour le faire fonctionner, vous avez juste besoin de changer ceci:

kpiList.IsRefreshing = IsRefreshing; 

par

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

Dans le premier vous n'assignez la valeur de la IsRefreshing de votre propriété de page à l'IsRefreshing propriété du ListView. Tous les changements ont été omis (comme vous l'avez remarqué).

Note: Si vous ne la liaison dans le XAML devrait également fonctionner, mais vous devrez également définir la BindingContext dans le constructeur de la MainPage.

Hope this helps.-

+0

A travaillé parfaitement. Je ne peux pas croire que je n'ai pas considéré cela. Merci beaucoup. –