Cvičení – převod obslužné rutiny události na příkaz

Dokončeno

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.

  1. Naklonujte nebo stáhněte úložiště cvičení.
  2. Přejděte do složky part6-exercise2 a otevřete řešení MovieCatalog.sln .
  3. 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í MovieListViewModelaplikace . 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.

  1. V okně Průzkumník řešení otevřete soubor ViewModels\MovieListViewModel.cs.

  2. Do třídy MovieListViewModel přidejte následující vlastnost:

    public ICommand DeleteMovieCommand { get; private set; }
    
  3. 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.

  4. Otevřete soubor ViewModels\MoviesListPage.xaml.

  5. MenuItem Aktualizujte na vazbu Command parametru s parametrem DeleteMovieCommand. Předat aktuální kontext vazby jako CommandParameter.

    <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 objektu MenuItem.

    Kontext Source vazby je nastavený na hlavní model zobrazení aplikace, stejně jako samotná stránka. Kontext vazby MenuItem zůstává film a je předán do objektu CommandParameter.

  6. Otevřete soubor kódu pro zobrazení, Views\MoviesListPage.xaml.cs a odeberte MenuItem_Clicked kód.

  7. 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í.