Exercice - Gérer la sélection à l’aide d’un modèle-vue
Pour les besoins de notre exercice, nous allons brièvement laisser derrière nous l’exemple d’application de ressources humaines. Nous utilisons plutôt une application qui liste des films. L’application comporte déjà deux pages et des modèles-vues disposant de liaisons de base. Les deux pages sont une page de liste et une page de détails. Nous allons modifier la logique de sélection afin que la ListView
et la page de détails utilisent la même propriété de modèle-vue.
Télécharger et exécuter l’exemple
Remarque
Si vous envisagez d’exécuter et de déboguer vos applications .NET MAUI sur Android à partir de Windows, il est préférable de cloner ou de télécharger le contenu de l’exercice sur un chemin de dossier court, comme C:\dev\, pour que les fichiers générés par la build ne dépassent pas la longueur maximale de chemin.
Pour démarrer ce module d’exercice, téléchargez le projet Échantillon de Liste de Films. Ce projet affiche une liste de films. Cliquer sur un film navigue vers une page détaillée incluant plus d’informations sur le film.
- Télécharger et extraire le projet Échantillon de Liste de Films vers un dossier temporaire.
- Accédez au dossier partie4-exercise1 et ouvrez la solution MovieCatalog.sln .
- Générez et exécutez le projet pour vérifier qu’il fonctionne. Sur l’écran affiché, vous verrez une liste de films. Sélectionnez l’un des films répertoriés et l’application navigue vers une page détaillée.
Examiner le code
Prenez quelques minutes pour examiner la structure des modes d’affichage et des vues. Si vous connaissez bien le langage XAML et la liaison de données, tout doit vous sembler familier, si ce n’est que la structure utilise le modèle MVVM.
Il existe un MovieListViewModel
qui sert à la fois de modèle-vue global de l’application et de modèle-vue pour MoviesListPage
. Ce mode d’affichage contient une liste de films chargés à partir du modèle, qui est un fichier json inclus dans le projet. L’autre mode d’affichage est MovieViewModel
et représente un film unique. Il remplit aussi deux rôles : fournir des données aux lignes de la page de liste et servir de BindingContext
à MovieDetailPage
.
Ajouter la prise en charge de la sélection
La MoviesListPage
est la page qui s’affiche lorsque l’application s’exécute pour la première fois. Le ListView
de la page est lié à la collection d’instances MovieViewModel
fournies par le mode d’affichage global, MovieListViewModel
. Lorsque vous sélectionnez l’un des films dans l’affichage, l’événement ItemTapped
accède au MovieDetailPage
, en passant le BindingContext
de l’élément, qui est un film, au constructeur de la vue. Le MovieDetailPage
définit le mode d’affichage qui a été passé en tant que BindingContext
de la page.
Au lieu de cela, nous allons mettre à jour l’application pour que la MovieDetailPage
lise le film sélectionné à partir du mode d’affichage de l’application globale.
Dans la fenêtre Explorateur de solutions, ouvrez le fichier ViewModels\MovieListViewModel.cs.
Ajoutez le code suivant à la classe
MovieListViewModel
:private MovieViewModel _selectedMovie; public MovieViewModel SelectedMovie { get => _selectedMovie; set => SetProperty(ref _selectedMovie, value); }
Ensuite, ouvrez le fichier Views\MoviesListPage.xaml.
Localisez l'élément
ListView
et ajoutez l'attributSelectedItem
:<ListView ItemsSource="{Binding Movies}" SelectedItem="{Binding SelectedMovie, Mode=OneWayToSource}" Margin ... >
Cet attribut lie l’élément sélectionné de la liste à la nouvelle propriété dans le mode d’affichage.
Ouvrez le fichier code-behind de l’affichage, Views\MoviesListPage.xaml.cs.
Remplacez le code du gestionnaire d’événements
ListView_ItemTapped
par le code suivant :private async void ListView_ItemTapped(object sender, ItemTappedEventArgs e) { await Navigation.PushAsync(new Views.MovieDetailPage()); }
Le
MovieDetailPage
n’accepte plus le film dans le constructeur, au lieu de cela, le nouveau constructeur lit le mode d’affichage principal de l’application.Ouvrez le fichier Views\MovieDetailPage.xaml.cs et remplacez le constructeur par le code suivant :
public MovieDetailPage() { BindingContext = App.MainViewModel.SelectedMovie; InitializeComponent(); }
Ce code définit le contexte de liaison de la vue au film sélectionné.
Exécutez l’application et vérifiez que le code fonctionne comme prévu.