Просто для того, чтобы все было ясно: я знаю, что MvvmCross очень гибко описывает, где и как можно создавать модели представлений. Мой вопрос скорее о правильном разделении проблем, упрощении проектирования сложных кросс-платформенных приложений.Кому нужно создавать экземпляры модели просмотра в MvvmCross
У нас есть приложение со списком клиентов и информацией о клиенте. На iPad и Surface список и данные отображаются на одной странице, но на более мелких устройствах список клиентов и детали для выбранного клиента разделяются между отдельными страницами. Итак, у нас есть PCL с CustomerListViewModel и CustomerDetailsViewModel. Теперь, как мы должны управлять временем жизни модели просмотра изнутри переносимой библиотеки классов?
Первоначально я сделал это с помощью кода в реализации CustomerListViewModel, который выглядит следующим образом:
public ICommand SelectCustomerCommand
{
get { return new MvxCommand(SelectCustomer); }
}
public void SelectCustomer()
{
if (formFactor == FormFactor.Phone)
{
ShowViewModel<CustomerDetailsViewModel>(new CustomerDetailsViewModel.NavObject(this.SelectedCustomer));
}
else
{
this.CustomerDetails = new CustomerDetailsViewModel(this.SelectedCustomer);
}
}
Что важно здесь то, что мы либо уравнять ShowViewModel, что в свою очередь просит выступающему построить объект CustomerDetailsViewModel и вынести его в новую страницу или явно создать экземпляр CustomerDetailsViewModel и связать его с CustomerDetails.
После просмотра эпизодов 32 и 42 видеороликов N + 1 MvvmCross я не уверен, что это правильный способ сделать это. Конечно, это работает, но должна ли модель просмотра заботиться о деталях создания экземпляра другой модели представления?
Моя вторая мысль была реорганизовать этот код и поместить эту логику в качестве ведущего, так что я могу просто написать в реализации CustomerListViewModel:
public void SelectCustomer()
{
ShowViewModel<CustomerDetailsViewModel>(new CustomerDetailsViewModel.NavObject(this.SelectedCustomer));
}
... и ведущий будет делать все остальное внутри кода, вызванного Вызов ShowViewModel. Тем не менее, в эпизоде 42 он показал, как контролировать жизнь вид модели прямо с соответствующей точки зрения:
protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
{
base.OnNavigatedFrom(e);
VisibleViewModel.IsVisible(false);
if (e.NavigationMode == NavigationMode.Back)
KillableViewModel.KillMe();
}
Но если пожизненный вид модели управляется ведущий, мы не должны пытаться поставить KillMe вызов внутри презентующего логика? Я знаю, что небольшая часть кода не имеет большого значения, но не может ли это быть преимуществом, чтобы поместить ее в класс ведущего и уменьшить код?
Спасибо. Я проверю ссылки в сообщении блога, на которое вы ссылаетесь. –
Я согласен с этой опцией - я предпочитаю, чтобы родительская виртуальная машина вызывала 'ShowViewModel' (или какую-то другую услугу), чем для того, чтобы она создавала виртуальную машину непосредственно в инструкции' if'. – Stuart