사람들이 특정 영화에 대한 정보를 볼 수있는 앱이 있습니다. 내 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"));
}
}
탐색 및 대화 상자 매개 변수는 모두 실제로 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] 삭제
몇 마디 만하겠습니다