将对象列表作为导航参数发送

问题描述 投票:1回答:1

我有一个可以让人们查看有关特定电影的信息的应用。在我的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"));
    }
}

xamarin.forms prism
1个回答
0
投票

但是据我了解,传递导航参数仅意味着传递字符串。这是真的吗?

幸运的是,与键关联的值可以是任何值(请查看the code):

public interface INavigationParameters : IEnumerable<KeyValuePair<string, object>>
© www.soinside.com 2019 - 2024. All rights reserved.