Cvičení – převod obslužné rutiny události na příkaz
V tomto cvičení přehodíte zpět na aplikaci "seznam filmů", se kterou jste pracovali v předchozím cvičení. Tentokrát převedete obslužnou rutinu události nabídky Delete na příkaz.
Stažení a spuštění ukázky
Poznámka:
Pokud plánujete spouštět a ladit aplikace .NET MAUI na Androidu z Windows, je nejlepší naklonovat nebo stáhnout cvičný obsah do krátké cesty ke složce, například C:\dev\, aby se zabránilo překročení maximální délky cesty vygenerovaných sestavením.
Tento projekt zobrazí seznam filmů. Kliknutím na video přejdete na stránku podrobností s dalšími informacemi o filmu.
- Naklonujte nebo stáhněte úložiště cvičení.
- Přejděte do složky part6-exercise2 a otevřete řešení MovieCatalog.sln .
- Sestavte a spusťte projekt, abyste měli jistotu, že funguje. Po zobrazení obrazovky by se měl zobrazit seznam filmů. Klikněte pravým tlačítkem myši na jeden z uvedených filmů a aplikace přejde na stránku podrobností.
Kontrola kódu
Otevřete řešení MovieCatalog a otevřete soubor Views\MovieListPage.xaml. Zobrazí ListView
položku pro každý film v vázané Movies
kolekci. Každá položka definuje místní nabídku pro odstranění videa:
<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>
Po kliknutí na MenuItem_Clicked
položku nabídky se vyvolá metoda a video se odebere. Kontext vazby položky nabídky je aktuální video, MovieViewModel
třída. Kód pro odebrání videa je ale na hlavním modelu zobrazení MovieListViewModel
aplikace . Obslužná rutina události považuje tento fakt za to, že získá kontext vazby položky nabídky a odešle ji do metody modelu viewmodel DeleteMovie
:
private void MenuItem_Clicked(object sender, EventArgs e)
{
MenuItem menuItem = (MenuItem)sender;
ViewModels.MovieViewModel movie = (ViewModels.MovieViewModel)menuItem.BindingContext;
App.MainViewModel.DeleteMovie(movie);
}
Přidání příkazu
Prvním krokem při převodu obslužné rutiny události na příkaz je přidání příkazu do modelu viewmodel. Tento příkaz přijme film a odebere ho z kolekce.
V okně Průzkumník řešení otevřete soubor ViewModels\MovieListViewModel.cs.
Do třídy
MovieListViewModel
přidejte následující vlastnost:public ICommand DeleteMovieCommand { get; private set; }
Dále vyhledejte
MovieListViewModel
konstruktor a vytvořte instanci příkazu:public MovieListViewModel() { Movies = []; DeleteMovieCommand = new Command<MovieViewModel>(DeleteMovie); }
Metoda
DeleteMovie
již existuje a přijímáMovieViewModel
parametr. Příkaz zabalí danou metodu a zpřístupní ji v modelu viewmodel.Otevřete soubor ViewModels\MoviesListPage.xaml.
MenuItem
Aktualizujte na vazbuCommand
parametru s parametremDeleteMovieCommand
. Předat aktuální kontext vazby jakoCommandParameter
.<MenuItem Text="Delete" IsDestructive="True" Command="{Binding DeleteMovieCommand, Source={x:Static local:App.MainViewModel}}" CommandParameter="{Binding}" />
Všimněte si, že obslužná rutina
Clicked
události byla odebrána z objektuMenuItem
.Kontext
Source
vazby je nastavený na hlavní model zobrazení aplikace, stejně jako samotná stránka. Kontext vazbyMenuItem
zůstává film a je předán do objektuCommandParameter
.Otevřete soubor kódu pro zobrazení, Views\MoviesListPage.xaml.cs a odeberte
MenuItem_Clicked
kód.Spusťte aplikaci a klikněte pravým tlačítkem nebo stiskněte jeden z filmů. V místní nabídce vyberte Odstranit . Film se ze seznamu odstraní.