Упражнение. Преобразование обработчика событий в команду
В этом упражнении переключите обратно на приложение "список фильмов", с которым вы работали в предыдущем упражнении. На этот раз вы преобразуете обработчик событий меню Delete в команду.
Скачивание и запуск примера приложения
Примечание.
Если вы планируете запускать и отлаживать приложения .NET MAUI в Android из Windows, лучше клонировать или скачать содержимое упражнения в короткий путь к папке, например C:\dev\, чтобы избежать превышения максимальной длины пути сборки.
Чтобы запустить этот модуль упражнений, скачайте пример проекта списка фильмов. В этом проекте отображается список фильмов. Щелкнув фильм, перейдите на страницу сведений с дополнительными сведениями о фильме.
- Скачайте и извлеките пример проекта списка фильмов в временную папку.
- Перейдите в папку part6-exercise2 и откройте решение MovieCatalog.sln .
- Выполните сборку и запуск проекта, чтобы убедиться, что он работает. На экране отображается список фильмов. Щелкните правой кнопкой мыши один из фильмов, перечисленных, и приложение переходит на страницу сведений.
Изучение кода
Откройте решение MovieCatalog и откройте файл Views\MovieListPage.xaml. Представляет ListView
элемент для каждого фильма в связанной Movies
коллекции. Каждый элемент определяет контекстное меню для удаления фильма:
<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>
Когда элемент меню щелкается, MenuItem_Clicked
вызывается и фильм удаляется. Контекст привязки элемента меню — текущий фильм, MovieViewModel
класс. Но код для удаления фильма находится в главном режиме MovieListViewModel
представления приложения. Обработчик событий считает это так, как он получает контекст привязки элемента меню и отправляет его в метод 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);
}
Добавление команды
Первым шагом при преобразовании обработчика событий в команду является добавление команды в модель представления. Эта команда принимает фильм и удаляет его из коллекции.
В окне Обозреватель решений откройте файл ViewModels\MovieListViewModel.cs.
Добавьте в класс
MovieListViewModel
следующее свойство:public ICommand DeleteMovieCommand { get; private set; }
Затем найдите
MovieListViewModel
конструктор и создайте экземпляр команды:public MovieListViewModel() { Movies = []; DeleteMovieCommand = new Command<MovieViewModel>(DeleteMovie); }
Метод
DeleteMovie
уже существует и принимаетMovieViewModel
параметр. Команда упаковывает этот метод и предоставляет его в режиме просмотра.Откройте файл ViewModels\MoviesListPage.xaml.
Обновите для привязки
MenuItem
Command
параметра к параметруDeleteMovieCommand
. Передайте текущий контекст привязкиCommandParameter
в качестве .<MenuItem Text="Delete" IsDestructive="True" Command="{Binding DeleteMovieCommand, Source={x:Static local:App.MainViewModel}}" CommandParameter="{Binding}" />
Обратите внимание, что
Clicked
обработчик событий был удален из негоMenuItem
.Контекст
Source
привязки устанавливается в основной режим представления приложения, как и сама страница. Контекст привязкиMenuItem
остается фильмом и передается в .CommandParameter
Откройте файл программной части представления, Views\MoviesListPage.xaml.cs и удалите
MenuItem_Clicked
код.Запустите приложение и щелкните правой кнопкой мыши или нажмете один из фильмов, выберите "Удалить " в контекстном меню. Фильм удаляется из списка.