Oefening: selectie beheren met behulp van een viewmodel
Voor onze oefening laten we het voorbeeld van de human resources-app kort achter. In plaats daarvan werken we met een toepassing waarin films worden vermeld. De app heeft al een aantal pagina's en viewmodels met enkele basisbindingen. De twee pagina's zijn een lijstpagina en een detailpagina. We wijzigen de selectielogica zodat de ListView
en de detailpagina dezelfde viewmodel-eigenschap gebruiken.
In deze module wordt de .NET 9.0 SDK gebruikt. Zorg ervoor dat .NET 9.0 is geïnstalleerd door de volgende opdracht uit te voeren in de opdrachtterminal van uw voorkeur:
dotnet --list-sdks
Uitvoer die vergelijkbaar is met het volgende voorbeeld wordt weergegeven:
8.0.100 [C:\Program Files\dotnet\sdk]
9.0.100 [C:\Program Files\dotnet\sdk]
Zorg ervoor dat er een versie wordt vermeld die begint met 9
. Als er geen wordt vermeld of de opdracht niet wordt gevonden, installeert u de meest recente .NET 9.0 SDK.
Open de startersoplossing
- Kloon of download de oefeningsopslagplaats.
- Download het voorbeeldproject Filmlijst en pak het uit in een tijdelijke map.
- Navigeer naar de map part4-exercise1 en open de MovieCatalog.sln-oplossing .
- Bouw het project en voer het uit om ervoor te zorgen dat het werkt. U ziet nu een lijst met films die op het scherm worden weergegeven. Selecteer een van de films in de lijst en de app gaat naar een detailpagina.
De code controleren
Neem enkele minuten de tijd om te onderzoeken hoe de viewmodels en weergaven zijn gestructureerd. Als u bekend bent met Extensible Application Markup Language (XAML) en gegevensbinding, moet deze er allemaal bekend uitzien, maar de structuur maakt gebruik van het MVVM-patroon (Model-View-ViewModel).
Er is een MovieListViewModel
die dubbele plicht dient als het algemene viewmodel van de app en als het viewmodel voor het MoviesListPage
. Dit viewmodel bevat een lijst met films die zijn geladen vanuit het model. Dit is een json-bestand dat in het project is opgenomen. Het andere viewmodel is MovieViewModel
, en vertegenwoordigt één film. Het biedt ook dubbele rechten: geef gegevens op voor de rijen op de lijstpagina en als de BindingContext
voor de MovieDetailPage
.
Ondersteuning voor selectie toevoegen
Dit MoviesListPage
is de eerste pagina die wordt weergegeven wanneer de app wordt uitgevoerd. De ListView
pagina is gebonden aan de verzameling exemplaren die MovieViewModel
worden geleverd door het algemene viewmodel. MovieListViewModel
Wanneer u een van de films in de weergave selecteert, navigeert de ItemTapped
gebeurtenis naar het MovieDetailPage
item, dat een film is, doorgegeven BindingContext
aan de constructor van de weergave. Hiermee MovieDetailPage
stelt u het viewmodel in dat is doorgegeven als de BindingContext
pagina.
In plaats daarvan gaan we de app bijwerken zodat de MovieDetailPage
geselecteerde film kan worden gelezen uit het viewmodel van de algehele app.
Open in het venster Solution Explorer het bestand ViewModels\MovieListViewModel.cs .
Voeg de volgende code toe aan de klasse
MovieListViewModel
:private MovieViewModel _selectedMovie; public MovieViewModel SelectedMovie { get => _selectedMovie; set => SetProperty(ref _selectedMovie, value); }
Open vervolgens het bestand Views\MoviesListPage.xaml .
Zoek het
ListView
element en voeg hetSelectedItem
kenmerk toe:<ListView ItemsSource="{Binding Movies}" SelectedItem="{Binding SelectedMovie, Mode=OneWayToSource}" Margin ... >
Met dit kenmerk wordt het geselecteerde item van de lijst gekoppeld aan de nieuwe eigenschap in het viewmodel.
Open het code-behind-bestand voor de weergave, Views\MoviesListPage.xaml.cs.
Vervang de code van de
ListView_ItemTapped
gebeurtenis-handler door de volgende code:private async void ListView_ItemTapped(object sender, ItemTappedEventArgs e) { await Navigation.PushAsync(new Views.MovieDetailPage()); }
De
MovieDetailPage
nieuwe constructor accepteert de film niet meer in de constructor, maar leest het hoofdweergavemodel van de app voor.Open het bestand Views\MovieDetailPage.xaml.cs en wijzig de constructor in de volgende code:
public MovieDetailPage() { BindingContext = App.MainViewModel.SelectedMovie; InitializeComponent(); }
Met deze code wordt de bindingscontext van de weergave ingesteld op de geselecteerde film.
Voer de app uit en controleer of de code werkt zoals bedoeld.