Oefening: een gebeurtenis-handler converteren naar een opdracht
In deze oefening gaat u terug naar de app 'filmlijst' waarmee u in de vorige oefening hebt gewerkt. Deze keer converteert u de gebeurtenis-handler van het menu Verwijderen naar een opdracht.
Het voorbeeld downloaden en uitvoeren
Notitie
Als u van plan bent om uw .NET MAUI-apps op Android vanuit Windows uit te voeren en fouten op te sporen, kunt u de inhoud van de oefening het beste klonen of downloaden naar een kort mappad, zoals C:\dev\, om te voorkomen dat door build gegenereerde bestanden de maximale padlengte overschrijden.
Als u deze oefeningsmodule wilt starten, downloadt u het project Movie List Sample . In dit project wordt een lijst met films weergegeven. Als u op een film klikt, gaat u naar een detailpagina met meer informatie over de film.
- Download het voorbeeldproject Filmlijst en pak het uit in een tijdelijke map.
- Navigeer naar de map part6-exercise2 en open de MovieCatalog.sln-oplossing .
- Bouw het project en voer het uit om ervoor te zorgen dat het werkt. Wanneer het scherm wordt weergegeven, ziet u een lijst met films. Klik met de rechtermuisknop op een van de vermelde films en de app gaat naar een detailpagina.
De code controleren
Open de MovieCatalog-oplossing en open het bestand Views\MovieListPage.xaml . Het ListView
bevat een item voor elke film in de gebonden Movies
verzameling. Elk item definieert een contextmenu om een film te verwijderen:
<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>
Wanneer op het menu-item wordt geklikt, wordt de MenuItem_Clicked
methode aangeroepen en wordt de film verwijderd. De bindingscontext van het menu-item is de huidige film, de MovieViewModel
klasse. Maar de code voor het verwijderen van een film bevindt zich in het hoofdweergavemodel MovieListViewModel
van de app. De gebeurtenishandler beschouwt dit feit omdat deze de bindingscontext van het menu-item krijgt en deze naar de methode van het viewmodel DeleteMovie
verzendt:
private void MenuItem_Clicked(object sender, EventArgs e)
{
MenuItem menuItem = (MenuItem)sender;
ViewModels.MovieViewModel movie = (ViewModels.MovieViewModel)menuItem.BindingContext;
App.MainViewModel.DeleteMovie(movie);
}
Een opdracht toevoegen
De eerste stap bij het converteren van de gebeurtenis-handler naar een opdracht is het toevoegen van de opdracht aan het viewmodel. Deze opdracht accepteert een film en verwijdert deze uit de verzameling.
Open in het venster Solution Explorer het bestand ViewModels\MovieListViewModel.cs .
Voeg de volgende eigenschap toe aan de klasse
MovieListViewModel
:public ICommand DeleteMovieCommand { get; private set; }
Zoek vervolgens de
MovieListViewModel
constructor en instantieer de opdracht:public MovieListViewModel() { Movies = []; DeleteMovieCommand = new Command<MovieViewModel>(DeleteMovie); }
De
DeleteMovie
methode bestaat al en accepteert eenMovieViewModel
parameter. Met de opdracht wordt die methode verpakt en weergegeven in het viewmodel.Open het bestand ViewModels\MoviesListPage.xaml .
Werk de
MenuItem
parameter bij om deCommand
parameter aan deDeleteMovieCommand
parameter te binden. Geef de huidige bindingscontext door als deCommandParameter
.<MenuItem Text="Delete" IsDestructive="True" Command="{Binding DeleteMovieCommand, Source={x:Static local:App.MainViewModel}}" CommandParameter="{Binding}" />
U ziet dat de
Clicked
gebeurtenis-handler is verwijderd uit deMenuItem
.De
Source
bindingscontext wordt ingesteld op het hoofdweergavemodel van de app, net zoals de pagina zelf. De bindingscontext van deMenuItem
film blijft de film en wordt doorgegeven aan deCommandParameter
.Open het code-behind-bestand voor de weergave, Views\MoviesListPage.xaml.cs en verwijder de
MenuItem_Clicked
code.Voer de app uit en klik met de rechtermuisknop of druk lang op een van de films. Selecteer Verwijderen in het contextmenu. De film wordt uit de lijst verwijderd.