首页 > 解决方案 > mvvm light wpf 导航

问题描述

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

我首先从这里尝试了 View First 方法。 https://stackoverflow.com/a/28968560/5272185

我发现的问题是 Frame frameworkelement 似乎在沙盒中运行,即使我将视图的 datacontext 设置为绑定到从我的 viewmodellocator 检索到的 viewmodel,我似乎在 Frame 内得到了一个不同的实例。此外,样式似乎没有被继承到 Frame 中,并且 MVVM Light Messenger 的消息似乎没有从 Frame 内显示的 View 中冒出来。

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

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

问题

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

  2. 如果 View first navigationservice 与链接中的代码完全一样。有没有办法让 Frame 继承正确的数据上下文和样式(根本不运行沙盒)?

  3. 如果元素位于 ViewBox 内,有人可以解释为什么提供的链接中的 VisualTreeHelper 代码找不到框架元素吗?

我还应该提到,我已经尝试在 ViewModel 上创建 CurrentVM 属性和 CurrentDetailMode 属性并将 ContentControl 的内容绑定到 CurrentVM 属性并使用 DataTemplates 和 DataTriggers(绑定到 CurrentDetailMode)将相应的 View 设置为视图模型。根据这个帖子。 https://rachel53461.wordpress.com/2011/12/18/navigation-with-mvvm-2/

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

标签: wpfmvvm-lightviewboxnavigationservice

解决方案


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

  1. 只需为 Detail 视图创建一个哑 ViewModel 类,为其提供 (Main)ViewModel 实例并将该 ViewModel 实例设为属性,以便您可以绑定到它。完毕!毕竟很容易,并且通过依赖注入它可以成为一种呼吸。

  2. 请参阅此链接页面。DataContext 不是从父框架继承的?

  3. 我解决了这个问题并在以下单独的问题中对其进行了跟踪。在此处查看答案 WPF ViewBox 阻止 VisualTreeHelper 搜索


推荐阅读