Вложенный MVVM с локатором - PullRequest
       11

Вложенный MVVM с локатором

0 голосов
/ 05 февраля 2012

Я работаю над приложением WP7 .-

Сводка
Я хочу показать страницу (1) со списком друзей, если коснулся друга, яПокажет страницу (2) с этой информацией о друге, а также список фильмов, которые этот друг смотрел.Затем, если я нажму на один из фильмов, я получу страницу (3) с информацией о фильме.Я пытаюсь использовать скороговорку MVVM с MVVM Light Toolkit.

Служба :
На каждой странице мне нужно будет вызывать API
Страница 1: /friend возвращает список друзей
Страница 2: /friend/5436 возвращает фильмы, просмотренные этим другом
Страница 3: /movie/87968 возвращает информацию о фильме

Что я сделал
Я создаю класс друга, у которого есть ObservableCollection of Movies

public class Friend: ObservableObject
{
    public Friend(){}
    public ObservableCollection<Movie> Movies{ get; set; }
}

Также создаю класс Movie с информацией о фильме.

Также модель представления, чтобы обернуть класс друга

public class FriendViewModel : ViewModelBase
{
    public Friend Model
    {
        get;
        private set;
    }

    public FriendViewModel(Friend model)
    {
         Model = model
    }
}

Затем модель представления, чтобы собрать всех друзей

public class FriendListViewModel : ViewModelBase
{

    // To store the Friend service returned by the locator
    private readonly IFriendService _friendService;

    // To store the friends. It should be bind the the listbox in the view
    public ObservableCollection<FriendViewModel> Friends
    {
        get;
        private set;
    }

    /// <summary>
    /// Initializes a new instance of the FriendListViewModel class.
    /// </summary>
    public FriendListViewModel(IFriendService friendService)
    {
        // The data service
        _friendService = friendService;

        // Get all the friends and add them to the Friends collection
        Friends = new ObservableCollection<FriendViewModel>();
        _friendService.GetFriends((result, error) =>
        {
            if (error != null)
            {
                MessageBox.Show(error.Message);
                return;
            }

            if (result == null)
            {
                MessageBox.Show("Nothing found");
                return;
            }

            foreach (var friend in friends)
            {
                Friends.Add(new FriendViewModel(friend));
            }

        });
    }
}

Каждая вещь работает с локатором, который является статическим ресурсом наApp.xaml и используемый в представлении, где я перечисляю друзей в качестве datacontext для представления
Это локатор

public class FriendViewModelLocator
{
    static FriendViewModelLocator()
    {
        ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);

        if (ViewModelBase.IsInDesignModeStatic)
        {
            SimpleIoc.Default.Register<IFriendService, Design.DesignFriendDataService>();

        }
        else
        {
            SimpleIoc.Default.Register<IFriendService, FriendService>();
        }

        SimpleIoc.Default.Register<FriendListViewModel>();
    }

    /// <summary>
    /// Gets the Main property.
    /// </summary>
    public FriendListViewModel FriendList
    {
        get
        {
            return ServiceLocator.Current.GetInstance<FriendListViewModel>();
        }
    }
}

Вопрос
Первая страницаработает, я получаю список друзей и могу отображать их.Также первая страница смешивается.Но тогда я не знаю, как перейти к следующим страницам.Я думал, что я должен передать тот же FriendViewModel Я нажал на страницу 2 и вызвать API, чтобы получить список фильмов.Но в некотором роде это исключено из модели «Друг», я не могу заполнить коллекцию «Фильмы» в «Друге».Должен ли я создавать разные обертки viewmodels для каждой страницы.Как настроить локатор, чтобы иметь возможность получать фильмы и информацию о фильме для страницы 3.

любые идеи, мысли, ресурсы для проверки?

1 Ответ

0 голосов
/ 05 февраля 2012

Я бы сделал следующее:

  • Просматриваете ли вы модель как свойство вашего приложения, чтобы она была доступна для каждой страницы вашего приложения.
  • Создайте модель представленияотражают структуру данных, то есть PersonViewModel, имеющий отношение к коллекции MovieViewModels, которая затем возвращает информацию о фильме.
  • При переходе от страницы к странице передайте строку запроса, которая разрешает следующую страницунайти элемент в модели представления, который должен использоваться для его DataContext.Например, при нажатии на фильм перейдите к MovieView.xaml?id=567, где 567 идентифицирует фильм.Затем вы можете найти фильм в методе NavigatedTo и установить его как DataContext.

Этот шаблон также поможет вам взломать ваше приложение, подробнее читайте в моем блоге A SimpleWP7 MVVM пример с надгробием .

...