Ü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 konvertieren Sie den Ereignishandler des Delete-Menüs in einen Befehl.
Herunterladen und Ausführen des Beispiels
- Navigieren Sie zum Ordner part6-exercise2, und öffnen Sie die Lösung MovieCatalog.sln in Visual Studio oder den Ordner in Visual Studio Code.
- 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. Klicken Sie mit der rechten Maustaste auf einen der aufgelisteten Filme, und die App navigiert zu einer Detailseite.
Untersuchen des Codes
Öffnen Sie die MovieCatalog-Lösung, und öffnen Sie die Datei Views\MovieListPage.xaml. Das ListView
Objekt stellt ein Element für jeden Film in der gebundenen Movies
Auflistung dar. Jedes Element definiert ein Kontextmenü zum Löschen eines Films:
<ListView.ItemTemplate>
<DataTemplate>
<TextCell Text="{Binding Title}" x:DataType="vm:MovieViewModel">
<TextCell.ContextActions>
<MenuItem Text="Delete" IsDestructive="True" Clicked="MenuItem_Clicked" />
</TextCell.ContextActions>
</TextCell>
</DataTemplate>
</ListView.ItemTemplate>
Wenn auf das Menüelement geklickt wird, wird das MenuItem_Clicked
Element aufgerufen, und der Film wird entfernt. Der Bindungskontext des Menüelements ist der aktuelle Film, die MovieViewModel
Klasse. Der Code zum Entfernen eines Films befindet sich jedoch im Haupt-ViewModel MovieListViewModel
der App. Der Ereignishandler betrachtet dies, da er den Bindungskontext des Menüelements abruft und an die Methode des ViewModels DeleteMovie
sendet:
private void MenuItem_Clicked(object sender, EventArgs e)
{
MenuItem menuItem = (MenuItem)sender;
ViewModels.MovieViewModel movie = (ViewModels.MovieViewModel)menuItem.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
MovieListViewModel
Konstruktor, und instanziieren Sie den Befehl:public MovieListViewModel() { Movies = []; DeleteMovieCommand = new Command<MovieViewModel>(DeleteMovie); }
Die
DeleteMovie
Methode ist bereits vorhanden und akzeptiert einenMovieViewModel
Parameter. Der Befehl umschließt diese Methode und macht sie im ViewModel verfügbar.Öffnen Sie die Datei ViewModels\MoviesListPage.xaml.
Aktualisieren Sie die
MenuItem
Bindung desCommand
Parameters anDeleteMovieCommand
. Übergeben Sie den aktuellen Bindungskontext alsCommandParameter
.<MenuItem Text="Delete" IsDestructive="True" Command="{Binding DeleteMovieCommand, Source={x:Static local:App.MainViewModel}}" CommandParameter="{Binding}" />
Beachten Sie, dass der
Clicked
Ereignishandler aus demMenuItem
entfernt wurde.Source
des Bindungskontexts wird auf das Haupt-ViewModel der App festgelegt, genau wie die Seite selbst. Der Bindungskontext desMenuItem
bleibt der Film, und das wird an dieCommandParameter
Datei übergeben.Öffnen Sie die CodeBehind-Datei für die Ansicht, Views\MoviesListPage.xaml.cs, und entfernen Sie den
MenuItem_Clicked
Code.Führen Sie die App aus, und klicken Sie mit der rechten Maustaste, oder drücken Sie einen der Filme, und wählen Sie im Kontextmenü Löschen aus. Der Film wird aus der Liste gelöscht.