Esercizio - Convertire un gestore eventi in un comando
In questo esercizio, tornare all'app "elenco film" con cui si è lavorato nell'esercizio precedente. Questa volta si converte il gestore eventi del menu Elimina in un comando.
Scaricare ed eseguire l'esempio
Nota
Se si prevede di eseguire le app .NET MAUI ed effettuarne il debug in Android da Windows, è consigliabile clonare o scaricare il contenuto dell'esercizio in un percorso di cartella breve, come ad esempio C:\dev\, per evitare che il percorso dei file generati dalla compilazione superi la lunghezza massima consentita.
Questo progetto visualizza un elenco di film. Facendo clic su un filmato si passa a una pagina di dettaglio con altre informazioni sul film.
- Clonare o scaricare il repository dell'esercizio.
- Passare alla cartella part6-exercise2 e aprire la soluzione MovieCatalog.sln.
- Compilare ed eseguire il progetto per assicurarsi che funzioni. Quando viene visualizzata la schermata, verrà visualizzato un elenco di filmati. Fare clic con il pulsante destro del mouse su uno dei filmati elencati e l'app passa a una pagina di dettaglio.
Esaminare il codice
Aprire la soluzione MovieCatalog e aprire il file Views\MovieListPage.xaml. ListView
presenta un elemento per ogni filmato nella raccolta di Movies
associata. Ogni elemento definisce un menu di scelta rapida per eliminare un filmato:
<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>
Quando si fa clic sulla voce di menu, il metodo MenuItem_Clicked
viene richiamato e il filmato viene rimosso. Il contesto di associazione della voce di menu è il film corrente, la classe MovieViewModel
. Ma il codice per la rimozione di un filmato si trova nel modello di visualizzazione principale dell'app MovieListViewModel
. Il gestore eventi tiene conto di questo fatto quando ottiene il contesto di associazione della voce di menu e lo invia al metodo DeleteMovie
del modello di visualizzazione:
private void MenuItem_Clicked(object sender, EventArgs e)
{
MenuItem menuItem = (MenuItem)sender;
ViewModels.MovieViewModel movie = (ViewModels.MovieViewModel)menuItem.BindingContext;
App.MainViewModel.DeleteMovie(movie);
}
Aggiungere un comando
Il primo passaggio per convertire il gestore eventi in un comando consiste nell'aggiungere il comando al modello di visualizzazione. Questo comando accetta un filmato e lo rimuove dalla raccolta.
Nella finestra Esplora soluzioni aprire il file ViewModels\MovieListViewModel.cs.
Aggiungere la proprietà seguente alla classe
MovieListViewModel
:public ICommand DeleteMovieCommand { get; private set; }
Trovare quindi il costruttore
MovieListViewModel
e creare un'istanza del comando:public MovieListViewModel() { Movies = []; DeleteMovieCommand = new Command<MovieViewModel>(DeleteMovie); }
Il metodo
DeleteMovie
esiste già e accetta un parametroMovieViewModel
. Il comando esegue il wrapping del metodo e lo espone nel modello di visualizzazione.Aprire il file ViewModels\MoviesListPage.xaml.
Aggiornare
MenuItem
per l'associazione del parametroCommand
alDeleteMovieCommand
. Passare il contesto di associazione corrente comeCommandParameter
.<MenuItem Text="Delete" IsDestructive="True" Command="{Binding DeleteMovieCommand, Source={x:Static local:App.MainViewModel}}" CommandParameter="{Binding}" />
Si noti che il gestore eventi
Clicked
è stato rimosso dalMenuItem
.Il
Source
del contesto di associazione è impostato sul modello di visualizzazione principale dell'app, proprio come la pagina stessa. Il contesto di associazione diMenuItem
rimane il filmato e viene passato aCommandParameter
.Aprire il file code-behind per la visualizzazione, Views\MoviesListPage.xaml.cs e rimuovere il codice
MenuItem_Clicked
.Eseguire l'app e fare clic con il pulsante destro del mouse o premere su uno dei filmati. Selezionare Elimina dal menu di scelta rapida. Il film viene eliminato dall'elenco.