Mvvm light wpf navigation



我想要实现的目标。MVVM Light WPF的导航服务,我可以很容易地说NavigateTo(View URI或ViewModel以及应该呈现View或ViewModel的框架元素的字符串名称(。

我首先从这里尝试了"查看优先"方法。 https://stackoverflow.com/a/28968560/5272185

我发现的问题是框架框架元素似乎在沙盒中运行,即使我将视图的数据上下文设置为绑定到从我的视图模型定位器检索到的视图模型,我似乎在框架中得到了一个不同的实例。此外,样式似乎没有继承到框架中,MVVM Light Messenger的消息似乎不会从框架中显示的视图中冒出来。

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

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

问题

  1. 如上所述,使用 ViewModel 优先导航服务时,是否有一种简单的方法来显示详细信息视图(共享 ViewModel(而不会重复代码?

  2. 在视图优先导航服务的情况下,与链接中的代码完全相同。有没有办法使框架继承正确的数据上下文和样式(根本不运行沙盒(?

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

我还应该提到,我已经尝试了在ViewModel上创建CurrentVM属性和CurrentDetailMode属性的方法,并将ContentControl的内容绑定到CurrentVM属性,并使用DataTemplates与DataTriggers(绑定到CurrentDetailMode(将相应的视图设置为ViewModels。根据这篇文章。 https://rachel53461.wordpress.com/2011/12/18/navigation-with-mvvm-2/

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

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

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

  2. 请参阅此链接页面。数据上下文不是从父框架继承的?

  3. 我解决了这个问题,并在以下单独的问题中对其进行了跟踪。在此处查看答案 WPF ViewBox 阻止可视化树帮助程序搜索

最新更新