Mvvm light wpf 导航

Mvvm light wpf navigation

我想达到的目标。用于 MVVM Light WPF 的导航服务,我可以轻松地说 NavigateTo(View URI 或 ViewModel 以及应该呈现 View 或 ViewModel 的框架元素的字符串名称)。

我首先从这里尝试了“查看优先”方法。

我发现它的问题是 Frame 框架元素似乎 运行 沙盒化,即使我将视图的数据上下文设置为绑定到从我的 viewmodellocator 检索到的视图模型,我似乎在框架。此外,样式似乎不会继承到框架中,并且 MVVM Light Messenger 的消息似乎不会从框架内显示的视图中冒出来。

如果 Frame 位于 ViewBox 中,则查找 Frame 元素的代码也会失败。我不知道为什么,但如果我只是删除 ViewBox,它就会正确找到它。

我忽略了 ViewBox 问题(删除了 ViewBox)并更改了 NavigationService 以存储 ViewModelBase 类型而不是 URI,我更改了代码以查找 ContentControl 类型的 FrameworkElement 而不是 Frame,设置 ContentControl 的内容而不是框架的来源。这样我就不应该运行进入沙盒的问题了。这行得通,但我现在没有切换到详细视图的好方法(使用相同的 ViewModel 作为多个视图的数据上下文)。

问题

  1. 当如上所述首先使用 ViewModel NavigationService 时,是否有一种无需代码重复即可显示详细视图(共享 ViewModel)的简单方法?

  2. 在视图第一个导航服务的情况下,与 link 中的代码完全相同。有没有办法让 Frame 继承正确的数据上下文和样式(根本不是 运行ning 沙盒)?

  3. 有人可以解释一下为什么提供的 link 中的 VisualTreeHelper 代码在 ViewBox 中找不到框架元素吗?

我还应该提到,我已经尝试过在 ViewModel 上制作 CurrentVM 属性 和 CurrentDetailMode 属性 并将 ContentControl 的内容绑定到 CurrentVM 属性 并使用 DataTemplates 的方法使用 DataTriggers(绑定到 CurrentDetailMode)将相应的 View 设置为 ViewModel。据此post。 https://rachel53461.wordpress.com/2011/12/18/navigation-with-mvvm-2/

效果很好,支持详细视图。我对导航服务的目标是我想将所有视图或视图模型添加到一个地方的服务中。不必在每个应该能够显示不同内容/视图的 ViewModel 上创建 CurrentVM 和 CurrentDetailMode 属性。而且我更喜欢一种比手动设置具有特殊 DataTriggers 以支持 "Detail" 视图的 Datatemplates 更简单的解决方案。所讨论的导航服务也有一个历史队列,因此可以返回。

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

  1. 只需为 Detail 视图创建一个哑 ViewModel class,为其提供 (Main)ViewModel 实例并将该 ViewModel 实例设为 属性,这样您就可以绑定到它。完毕!毕竟很容易,加上依赖注入就可以变成一口气了。

  2. 看到这个linkpage.DataContext not inherited from parent Frame?

  3. 我解决了这个问题并在下面的单独问题中进行了跟踪。在这里查看答案