Отправить список объектов в качестве параметра навигации - PullRequest
1 голос
/ 08 мая 2020

У меня есть приложение, которое позволяет людям просматривать информацию о c определенных фильмах. На моей главной странице (GenreListPage) у меня есть список, в котором каждый фильм в базе данных сортируется по списку жанров. Тип жанра и количество фильмов одного жанра отображаются в CollectionView ItemTemplate (GenreModel). Когда пользователь нажимает на жанр, он переходит на другую страницу с другим CollectionView (FilmListPage). этот CollectionView заполняется ItemTemplate, содержащим название фильма и рейтинг (FilmModel).

В настоящее время, когда пользователь переходит на FilmListPage, конструктор вызывает метод, который запрашивает базу данных, извлекая все фильмы с указанным выбранным жанром в GenreListPage.

Я хочу изменить это, поэтому я включил List типа FilmModel в мою GenreModel. Когда я перехожу к 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"));
    }
}

Ответы [ 2 ]

1 голос
/ 08 мая 2020

Параметры навигации и диалогов на самом деле равны 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 заданного типа generi c.

0 голосов
/ 08 мая 2020

Однако, насколько я понимаю, передача параметров навигации означает передачу только строк. Это правда?

К счастью, нет, значение, связанное с ключом, может быть любым (посмотрите код ):

public interface INavigationParameters : IEnumerable<KeyValuePair<string, object>>
...