Übung – Konvertieren eines Ereignishandlers in einen Befehl
Tauschen Sie in dieser Übung mit der App "Filmliste" zurück, mit der Sie in der vorherigen Übung gearbeitet haben. Dieses Mal wandeln Sie den Ereignishandler der Wischbewegung zum Löschen in einen Befehl um.
Herunterladen und Ausführen des Beispiels
Hinweis
Wenn Sie planen, Ihre .NET MAUI-Apps unter Windows auszuführen und zu debuggen, empfiehlt es sich, den Übungsinhalt in einen kurzen Ordnerpfad wie C:\dev\zu klonen oder herunterzuladen, um zu vermeiden, dass buildgenerierte Dateien die maximale Pfadlänge überschreiten.
Dieses Projekt zeigt eine Liste der Filme an. Wenn Sie auf einen Film klicken, navigiert sie zu einer Detailseite mit weiteren Informationen zum Film.
- Klonen oder Herunterladen des Übungs-Repositorys.
- Navigieren Sie zum Ordner "part6-übung2 ", und öffnen Sie die MovieCatalog.sln Lösung.
- Erstellen Sie das Projekt, und führen Sie es aus, um sicherzustellen, dass es funktioniert. Auf dem angezeigten Bildschirm wird eine Liste der Filme angezeigt. Wischen Sie auf einem der aufgelisteten Filme nach links, um die Löschaktion anzuzeigen.
Untersuchen des Codes
Öffnen Sie die MovieCatalog-Lösung , und öffnen Sie die Datei Views\MovieListPage.xaml . Das CollectionView Objekt stellt ein Element für jeden Film in der gebundenen Movies Auflistung dar. Jedes Element verwendet ein SwipeView, um eine Löschaktion durchzuführen.
<CollectionView.ItemTemplate>
<DataTemplate x:DataType="vm:MovieViewModel">
<SwipeView>
<SwipeView.RightItems>
<SwipeItems>
<SwipeItem Text="Delete"
BackgroundColor="Red"
Clicked="MenuItem_Clicked" />
</SwipeItems>
</SwipeView.RightItems>
<VerticalStackLayout Padding="10">
<Label Text="{Binding Title}"
FontSize="16" />
</VerticalStackLayout>
</SwipeView>
</DataTemplate>
</CollectionView.ItemTemplate>
Wenn auf das Wischelement geklickt wird, wird die MenuItem_Clicked Methode aufgerufen, und der Film wird entfernt. Der Bindungskontext des Wischelements ist der aktuelle Film, die MovieViewModel Klasse. Der Code zum Entfernen eines Films befindet sich jedoch im Haupt-ViewModel MovieListViewModel der App. Der Ereignishandler berücksichtigt diese Tatsache, da er den Bindungskontext des Wischelements abruft und an die Methode des Ansichtsmodells DeleteMovie sendet:
private void MenuItem_Clicked(object sender, EventArgs e)
{
SwipeItem swipeItem = (SwipeItem)sender;
ViewModels.MovieViewModel movie = (ViewModels.MovieViewModel)swipeItem.BindingContext;
App.MainViewModel.DeleteMovie(movie);
}
Hinzufügen eines -Befehls
Der erste Schritt beim Konvertieren des Ereignishandlers in einen Befehl besteht darin, dem ViewModel den Befehl hinzuzufügen. Dieser Befehl akzeptiert einen Film und entfernt ihn aus der Sammlung.
Öffnen Sie im Projektmappen-Explorer-Fenster die Datei ViewModels\MovieListViewModel.cs.
Fügen Sie der
MovieListViewModel-Klasse die folgende Eigenschaft hinzu:public ICommand DeleteMovieCommand { get; private set; }Suchen Sie als Nächstes den
MovieListViewModelKonstruktor, und instanziieren Sie den Befehl:public MovieListViewModel() { Movies = []; DeleteMovieCommand = new Command<MovieViewModel>(DeleteMovie); }Die
DeleteMovieMethode ist bereits vorhanden und akzeptiert einenMovieViewModelParameter. Der Befehl umschließt diese Methode und macht sie im ViewModel verfügbar.Öffnen Sie die Datei Views\MoviesListPage.xaml .
Aktualisieren Sie das
SwipeItem, um denCommand-Parameter an dasDeleteMovieCommandzu binden. Übergeben Sie den aktuellen Bindungskontext alsCommandParameter.<SwipeItem Text="Delete" BackgroundColor="Red" Command="{Binding DeleteMovieCommand, Source={x:Static local:App.MainViewModel}}" CommandParameter="{Binding}" />Beachten Sie, dass der
ClickedEreignishandler aus demSwipeItementfernt wurde.Sourcedes Bindungskontexts wird auf das Haupt-ViewModel der App festgelegt, genau wie die Seite selbst. Der Bindungskontext vonSwipeItembleibt der Film und wird anCommandParameterübergeben.Öffnen Sie die Code-Behind-Datei für die Ansicht, Ansichten\MoviesListPage.xaml.cs, und entfernen Sie den Code
MenuItem_Clicked.Führen Sie die App aus, und wischen Sie auf einem der Filme nach links. Wählen Sie „Löschen“ bei der Wischgeste aus. Der Film wird aus der Liste gelöscht.