【问题标题】:How can I navigate from StackLayout DataTemplateSelector View?如何从 StackLayout DataTemplateSelector 视图导航?
【发布时间】:2020-11-22 06:38:56
【问题描述】:

我有 1 个包含数据模板选择器的堆栈布局。我为此使用 BindableLayout。 现在 stacklayout 中的每个子视图都有单独的视图模型。 我想从那个 ViewModel 导航到其他屏幕。

我的数据模板选择器中有以下代码

var pageViewModel = (SomeViewModel)container.BindingContext;
if (view == Type.A)
{
  widgetView = new AView();
  widgetViewModel = pageViewModel.ServiceProvider.GetService<AViewModel>();
}
else
{
  widgetView = new BView();
  widgetViewModel = pageViewModel.ServiceProvider.GetService<BViewModel>();
}
widgetView.ViewModel = widgetViewModel;

var navigationParams = new NavigationParameters
                {
                    { Item, item }
                };
            widgetViewModel.LoadData(navigationParams);

            return new DataTemplate(() => widgetView);

我正在尝试从 CustomView 的 ViewModel 做

await NavigationService.NavigateAsync("PageC");

我正在获取 NavigationService 对象,但应用没有导航到 PageC 如果我在 PageViewModel 的同一行上方调用,则应用程序将重定向到 PageC

【问题讨论】:

  • 我会使用 MessagingCenter 从您的虚拟机向您的页面发送一条消息,请求它执行导航
  • 您是如何在自定义视图中获得此 NavigationService 的?
  • 我自动搞定了,可能是因为我是这样注册ViewModel的。 registry.Register();
  • @Jason 除了 MessagingCenter 有什么办法吗?我们可以在 App.Xaml.cs 中使用 protected override void ConfigureViewModelLocator() 之类的东西来修改 NavigationService 参数吗?

标签: mvvm xamarin.forms prism


【解决方案1】:

使用预定义的操作在视图模型中实现 ICommand 属性:

public ICommand Command { get; set; }

并将其绑定到您在自定义视图中用于导航事件的任何控件。

如果您在代码中完成所有操作,则必须以某种方式将 PageViewModel PRISM NavigationService 实例也传递给自定义视图模型。

var navigationParams = new NavigationParameters
{
    { Item, item },
    { NavigationService, pageNavigationService)
};

如果没有实际代码,我无法确切地知道如何。

【讨论】:

  • 我想你误解了我的问题。我知道 ICommand,但问题是我必须从 Control 的 ViewModel 导航。
  • @SagarPanwala 我理解这个问题,我经常使用 DataLayout 中的那种导航。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-03
  • 2021-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多