0

场景:我有视图、视图模型和PickList模型PickLinePickListViewModel包含一个ObservableCollection<PickLineViewModel>,模型PickList包含一个List<PickLine>。我的PickList页面包含一个ListView绑定到的ObservableCollection<PickLineViewModel>,如果点击了一条线,NavigateAsync则调用它来导航到点击的 PickLine。

通常,当我调用NavigateAsyncPrism 时,导航到页面,定位视图模型,创建它的实例并将该实例绑定到视图。但在这种情况下,应该绑定到页面的视图模型实例已经存在(作为 my 的一个元素ObservableCollection),我不希望 Prism ViewModelLocator 创建一个新实例,因为它必须从 Web 服务获取数据,我尽量减少 Web 服务调用的数量。

我也不能在中使用模型,ObservableCollection因为视图模型包含仅用于 UI 目的的属性,所以这些属性绝对不应该是模型的一部分,但是我正在谈论的 UI 属性在PickList页面和PickLine页面。

Tl; dr:在 Prism.Forms 中是否有任何方法可以在导航到将绑定到它的页面时提供视图模型实例?

4

2 回答 2

0

Prism.Forms 中是否有任何方法可以在导航到将绑定到它的页面时提供视图模型实例?

不,据我所知,Prism Forms 不提供视图模型优先导航(与 WPF 上的 Prism 不同)。

但是,您应该能够通过将现有视图模型作为参数传递并使ViewModelLocator-created 视图模型成为将所有内容重定向到实际视图模型的“空壳”来解决此问题。

于 2020-01-27T18:03:54.770 回答
0

您的问题是您混淆了 Model 是什么以及 ViewModel 是什么。在这种情况下,您应该拥有的是:

  • PickLine(型号)
  • PickLineView(视图)
  • PickLineViewModel (视图模型)
  • PickLineListView(视图)
  • PickLineListViewModel (视图模型)
    • 包含你的 ObservableCollectionPickLine不是 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
              });
}

我经常从混淆模型和 ViewModel 之间区别的人那里看到类似上面的代码,并且经常从不了解如何从 ListView 中的 Cell 之类的东西正确绑定回 ViewModel 的人那里看到。

相反,您应该拥有的代码更像:

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);
}
于 2020-01-27T15:34:44.473 回答