【发布时间】:2018-08-20 21:09:33
【问题描述】:
我想要达到的目标。 MVVM Light WPF 的导航服务,我可以轻松地说 NavigateTo(View URI 或 ViewModel 以及应该呈现 View 或 ViewModel 的框架元素的字符串名称)。
我首先从这里尝试了 View First 方法。 https://stackoverflow.com/a/28968560/5272185
我发现的问题是 Frame 框架元素似乎在沙盒中运行,即使我将视图的 datacontext 设置为绑定到从我的 viewmodellocator 检索到的视图模型,我似乎在 Frame 中得到了一个不同的实例。此外,样式似乎没有被继承到 Frame 中,并且 MVVM Light Messenger 的消息似乎没有从 Frame 内显示的 View 中冒出来。
如果 Frame 位于 ViewBox 中,则查找 Frame 元素的代码也会失败。我不知道为什么,但如果我只是删除 ViewBox,它会正确找到它。
我忽略了 ViewBox 问题(删除了 ViewBox)并更改了 NavigationService 以存储 ViewModelBase 类型而不是 URI,并且我更改了代码以找到 ContentControl 类型的 FrameworkElement 而不是 Frame,设置 ContentControl 的内容而不是 Frame 的源.所以我不应该遇到沙盒问题。这行得通,但我现在没有切换到详细视图的好方法(使用相同的 ViewModel 作为多个视图的数据上下文)。
问题
如上所述,当使用 ViewModel 第一个 NavigationService 时,是否有一种简单的方法来显示详细视图(共享 ViewModel)而无需重复代码?
如果 View first navigationservice 与链接中的代码完全一样。有没有办法让 Frame 继承正确的数据上下文和样式(根本不运行沙盒)?
如果元素位于 ViewBox 内,谁能解释为什么提供的链接中的 VisualTreeHelper 代码找不到框架元素?
我还应该提到,我已经尝试在 ViewModel 上创建 CurrentVM 属性和 CurrentDetailMode 属性并将 ContentControl 的内容绑定到 CurrentVM 属性并使用 DataTemplates 和 DataTriggers(绑定到 CurrentDetailMode)来设置相应的 View(s ) 到 ViewModel。根据这个帖子。 https://rachel53461.wordpress.com/2011/12/18/navigation-with-mvvm-2/
它运行良好并支持详细视图。我对导航服务的目标是我想将所有视图或视图模型添加到一个地方的服务中。不必在应该能够显示不同内容/视图的每个 ViewModel 上创建 CurrentVM 和 CurrentDetailMode 属性。而且我更喜欢一个更简单的解决方案,而不是手动设置具有特殊 DataTriggers 以支持“详细信息”视图的数据模板。此外,所讨论的导航服务有一个历史队列,因此可以返回。
【问题讨论】:
标签: wpf mvvm-light viewbox navigationservice