我有一个应用程序,可以让人们查看有关特定电影的信息。在我的MainPage(GenreListPage)中,我有一个列表,该列表将数据库中的每个电影分类为一个类型列表。相同类型的电影的类型和片数显示在CollectionView ItemTemplate(GenreModel)中。当用户点击流派时,他们导航到另一个具有另一个CollectionView(FilmListPage)的页面。此CollectionView中装有包含影片标题和等级(FilmModel)的ItemTemplate。
当前,当用户导航到FilmListPage时,构造函数将调用查询数据库的方法,以检索在GenreListPage中选择的指定类型的所有电影。
我想更改此设置,因此我在GenreModel中包括了FilmModel类型的列表。当我导航到FilmListPage时,我想将FilmModel列表作为参数传递并在FilmListPage中检索它。但是,根据我的理解,传递导航参数仅意味着传递字符串。这是真的?
一些代码;
GenreModel.cs
public class GenreModel{
public string GenreType {get; set;}
public List<FilmModel> AssociatedFilms {get; set;}
}
FilmModel.cs
public class FilmModel {
public string Title {get; set;}
public double Rating {get; set;}
}
GenreListPageViewModel.cs
public class GenreListPageViewModel.cs : ViewModelBase
{
private GenreModel _selectedGenre;
private List<GenreModel> _genres;
public GenreModel SelectedGenre
{
get => _selectedGenre;
set => SetProperty(ref _selectedGenre, value);
}
public List<GenreModel> Genres
{
get => _genres;
set => SetProperty(ref _genres, value);
}
public GenreListPageViewModel(INavigationService navigationService, IDatabaseService databaseService) : base (navigationService)
{
Genres = new ObservableCollection<GenreModel>(databaseService.GetFilms());
}
public async void ItemSelected()
{
var p = new NavigationParameters;
p.Add("Films", SelectedGenre.AssociatedFilms);
p.Add("Genre", SelectedGenre.GenreType);
await NavigationService.NavigateAsync("FilmListPage", p);
}
}
FilmListPageViewModel.cs
public class FilmListPageViewModel.cs : ViewModelBase, INavigationAware
{
IDatabaseService _databaseService;
private string _genre;
private List<FilmModel> _films = new List<FilmModel>();
public string Genre
{
get => _genre;
set => SetProperty(ref _genre, value);
}
public List<FilmModel> Films
{
get => _films;
set => SetProperty(ref _films, value);
}
public GenreListPageViewModel(INavigationService navigationService, IDatabaseService databaseService) : base (navigationService)
{
_databaseService = databaseService;
}
public void OnNavigatedFrom(INavigationParameters parameters)
{
}
public void OnNavigatedTo(INavigationParameters parameters)
{
Genre = parameters.GetValue<string>("Genre")};
//old code that used to get film by selected genre
//Films = databaseService.GetFilmsByGenre(Genre);
Films = new ObservableCollection<FilmModel>(parameters.GetValues<FilmModel>("Films"));
}
}
Navigation和Dialog参数实际上都是IEnumerable<KeyValuePair<string, object>>
。那么这对你的意义是什么?
对于初学者来说,这意味着任何给定的键都可以包含一个或多个实际值。
navigationParameters.Add("message", "Prism is great for Wpf apps");
navigationParameters.Add("message", "Prism is great for Xamarin.Forms apps");
navigationParameters.Add("message", "Prism is great for Uno and WinUI apps");
其次,这意味着您可以传递任何您想要的参数。
var messages = new[] {
"Prism is great for Wpf apps",
"Prism is great for Xamarin.Forms apps",
"Prism is great for Uno and WinUI apps"
};
navigationParameters.Add("message", messages);
如您所知,您可以像这样拉回参数:
var messages = navigationParameters.Get<IEnumerable<string>>("message");
如果您使用添加消息的第一种方式使用此方法,则可能会遇到异常,因为它将达到第一个值,并且看到它不是同一类型。如果您以第二种方式添加它,由于添加了,它仍然可以工作IEnumerable<string>
。
但是,还有第二种方法可以很好地满足您的需求,并且不管您如何添加值都可以使用。
var messages = navigationParameters.GetValues<string>("message");
该GetValues
方法返回给定泛型类型的IEnumerable。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句