Xamarin.Forms stellt ab der Version 1.4 die Funktionalität Pull to Refresh zur Verfügung. Damit ist es dem Benutzer möglich eine ListView selbständig zu aktualisieren.
public event EventHandler Refreshing; public bool IsPullToRefreshEnabled { get; set; } = false; public bool IsRefreshing { get; set; } = false; public ICommand RefreshCommand { get; set; } = null; public void BeginRefresh (); public void EndRefresh ();
Sobald der Benutzer die “Pull to Refresh” Funktion ausführt, wird der RefreshCommand aufgerufen, der Refreshed-Event ausgelöst und IsRefreshing wird auf True gesetzt. Anschliessend wird eine plattformabhängige Animation solange sichtbar, bis IsRefreshing auf False gesetzt oder beim Event die EndRefresh-Methode aufgerufen wird. Mit MVVM verwende ich den RefreshCommand zusammen mit dem IsRefreshing-Flag wie folgt. Zuerst die View mit der ListView:
<ListView x:Name="listViewNews" ItemsSource="{Binding ListNews}" IsPullToRefreshEnabled="True" RefreshCommand="{Binding LoadNewsCommand}" IsRefreshing="{Binding IsBusy}" HasUnevenRows="True">
Das dazugehörige ViewModel implementiert den RefreshCommand und setzt IsBusy auf False sobald die ListView mit den aktuellsten News geladen wurde.
private bool _isBusy; public bool IsBusy { get { return _isBusy; } set { _isBusy = value; // Mit der ViewModelBase-Klasse von GalaSoft.MvvmLight muss nur diese // Funktion aufgerufen werden anstatt OnPropertyChanged("IsBusy"). RaisePropertyChanged(); } } private Command _loadNewsCommand; public ICommand LoadNewsCommand { get { return _loadnewsCommand ?? (_loadNewsCommand = new Command(RefreshNews, () => !IsBusy)); } } private async void RefreshNews() { IsBusy = true; // Refresh all News and update ListView IsBusy = false; }
Da ich IsBusy auf True setzte sobald der RefreshCommand aufgerufen wird, kann ich IsBusy auch gleich für die CanExecute-Methode verwenden.
Fazit
Mit Xamarin.Forms 1.4 kann ohne grossen Aufwand ein Feature in die Mobile-App implementiert werden, welches für iOS- und Android Benutzer zum Standard gehört und von den meisten schlicht erwartet wird.