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