代码之家  ›  专栏  ›  技术社区  ›  Johan

MVVM灯光WPF导航

  •  1
  • Johan  · 技术社区  · 6 年前

    我想要实现的。mvvm light wpf的导航服务,在这里我可以很容易地说navigateTo(视图uri或viewModel,以及应该显示视图或viewModel的框架元素的字符串名称)。

    我首先尝试了从这里开始的“视图优先”方法。 https://stackoverflow.com/a/28968560/5272185

    我发现的问题是框架frameworkelement似乎运行沙盒,即使我将视图的dataContext设置为绑定到从我的viewModelLocator检索到的viewModel,我似乎在框架内获得了不同的实例。此外,样式似乎不会继承到框架中,MVVM Light Messenger的消息似乎也不会从框架中显示的视图中冒泡出来。

    此外,如果框架位于一个视图框中,查找框架元素的代码也会失败。我不知道为什么,但如果我只是移除了这个视盒,它就会发现它是正确的。

    我忽略了viewbox问题(删除了viewbox),将navigationservice更改为存储viewModelBase类型而不是uri,并更改了代码以查找ContentControl类型的FrameworkElement而不是Frame,设置ContentControl的内容而不是Frame的源。所以我不应该碰到沙盒问题。这很有效,但我现在没有很好的方法切换到细节视图(对多个视图使用与DataContext相同的ViewModel)。

    问题

    1. 如上文所述,在使用ViewModel First NavigationService时,是否有一种简单的方法可以在不重复代码的情况下显示详细视图(共享ViewModel)?

    2. 如果是视图First NavigationService,则与链接中的代码完全相同。是否有方法使框架继承正确的DataContext和样式(根本不运行沙盒)?

    3. 有人能解释为什么如果元素在一个视图框中,那么所提供链接中的VisualTreeHelper代码找不到框架元素吗?

    我还应该提到,我尝试了在ViewModel上生成currentvm属性和currentdetailMode属性的方法,并将ContentControl的内容绑定到currentvm属性,并使用带有DataTriggers的DataTemplate(绑定到currentdetailMode)将相应的视图设置为ViewModels。根据这篇文章。 https://rachel53461.wordpress.com/2011/12/18/navigation-with-mvvm-2/

    它工作良好,支持细节视图。我使用navigationservice的目标是在一个地方将所有视图或视图模型添加到服务中。不必在每个应该能够显示不同内容/视图的视图模型上创建currentvm和currentdetailmode属性。我更喜欢一个比用特殊的数据触发器手动设置数据模板来支持“细节”视图更简单的解决方案。另外,讨论的导航服务有一个历史队列,因此可以返回。

    1 回复  |  直到 6 年前
        1
  •  0
  •   Johan    6 年前

    我设法解决/回答了我自己的问题

    1. 只需为细节视图创建一个哑的ViewModel类,为它提供(主)ViewModel实例,并使该ViewModel实例成为一个属性,以便您可以绑定到它。完成!毕竟很容易,而且通过依赖性注射,它可以变成呼吸。

    2. 看到这个链接 page.DataContext not inherited from parent Frame?

    3. 我解决了这个问题,并在下面的单独问题中跟踪它。在这里看到答案 WPF ViewBox blocks VisualTreeHelper search