Используйте NavigateAsyn c в Prism.Forms с уже существующей ViewModel - PullRequest
0 голосов
/ 27 января 2020

Сценарий: У меня есть вид, вид модели и модель для PickList и PickLine. PickListViewModel содержит ObservableCollection<PickLineViewModel>, а модель PickList содержит List<PickLine>. Моя PickList страница содержит ListView, которая привязана к ObservableCollection<PickLineViewModel>, и если линия нажата, NavigateAsync вызывается для перехода к повернутой линии PickLine.

Обычно, когда я звоню NavigateAsync Prism переходит на страницу, находит модель представления, создает ее экземпляр и привязывает этот экземпляр к представлению. Но в этом случае экземпляр модели представления, который должен быть привязан к странице, уже существует (как элемент моего ObservableCollection), и я не хочу, чтобы Prism ViewModelLocator создавал новый экземпляр, из-за того, что он затем пришлось бы получать данные из веб-службы, и я стараюсь максимально сократить число вызовов веб-служб.

Также я не могу использовать модели в ObservableCollection, поскольку модель представления содержит свойства, которые используется только для целей пользовательского интерфейса, поэтому эти свойства определенно не должны быть частью модели, но свойства пользовательского интерфейса, о которых я говорю, необходимы на странице PickList и на странице PickLine.

Tl; dr: есть ли способ в Prism.Forms предоставить экземпляр модели представления при переходе на страницу, которая будет к ней привязана?

Ответы [ 2 ]

0 голосов
/ 27 января 2020

Есть ли способ в Prism.Forms предоставить экземпляр модели представления при переходе на страницу, которая будет к ней привязана?

Нет, насколько я знаю, Prism Forms не обеспечивает навигацию, основанную на модели представления (в отличие от Prism в WPF, которая это делает).

Однако вы должны обойти эту проблему, передав существующую модель представления в качестве параметра и сделав * Созданная модель представления 1007 * - «пустая оболочка», которая перенаправляет все на фактическую модель представления.

0 голосов
/ 27 января 2020

Ваша проблема в том, что вы путаете, что такое Модель и что такое ViewModel. В этом случае у вас должно быть:

  • PickLine (модель)
  • PickLineView (представление)
  • PickLineViewModel (ViewModel)
  • PickLineListView ( Представление)
  • PickLineListViewModel (ViewModel)
    • Содержит вашу наблюдаемую коллекцию PickLine не PickLineViewModel

Не видя вашего точного кода, я ' Исходя из опыта, я собираюсь предположить, что ваш код в принципе выглядит примерно так:

public ObservableCollection<PickLineViewModel> Items { get; set; }
public DelegateCommand<PickLineViewModel> ItemTappedCommand { get; }
public void OnNavigatedTo(INavigationAware parameters)
{
    var picks = _dataService.GetPickLines();
    Items = new ObservableCollection<PickLineViewModel>(
              picks.Select(x => new PickLineViewModel
              {
                  Model = x,
                  ItemTappedCommand = ItemTappedCommand
              });
}

Я часто вижу код, подобный приведенному выше, от людей, которые путают разницу между Model и ViewModel, и часто от людей, которые не понимают, как правильно привязать к ViewModel что-то вроде ячейки в ListView.

Вместо этого вы должны иметь код, который больше похож на:

public ObservableCollection<PickLine> Items { get; set; }
public DelegateCommand<PickLine> ItemTappedCommand { get; }
public void OnNavigatedTo(INavigationAware parameters)
{
    var picks = _dataService.GetPickLines();
    Items = new ObservableCollection<PickLine>(picks);
}
...