我想要实现的。mvvm light wpf的导航服务,在这里我可以很容易地说navigateTo(视图uri或viewModel,以及应该显示视图或viewModel的框架元素的字符串名称)。
我首先尝试了从这里开始的“视图优先”方法。
https://stackoverflow.com/a/28968560/5272185
我发现的问题是框架frameworkelement似乎运行沙盒,即使我将视图的dataContext设置为绑定到从我的viewModelLocator检索到的viewModel,我似乎在框架内获得了不同的实例。此外,样式似乎不会继承到框架中,MVVM Light Messenger的消息似乎也不会从框架中显示的视图中冒泡出来。
此外,如果框架位于一个视图框中,查找框架元素的代码也会失败。我不知道为什么,但如果我只是移除了这个视盒,它就会发现它是正确的。
我忽略了viewbox问题(删除了viewbox),将navigationservice更改为存储viewModelBase类型而不是uri,并更改了代码以查找ContentControl类型的FrameworkElement而不是Frame,设置ContentControl的内容而不是Frame的源。所以我不应该碰到沙盒问题。这很有效,但我现在没有很好的方法切换到细节视图(对多个视图使用与DataContext相同的ViewModel)。
问题
-
如上文所述,在使用ViewModel First NavigationService时,是否有一种简单的方法可以在不重复代码的情况下显示详细视图(共享ViewModel)?
-
如果是视图First NavigationService,则与链接中的代码完全相同。是否有方法使框架继承正确的DataContext和样式(根本不运行沙盒)?
-
有人能解释为什么如果元素在一个视图框中,那么所提供链接中的VisualTreeHelper代码找不到框架元素吗?
我还应该提到,我尝试了在ViewModel上生成currentvm属性和currentdetailMode属性的方法,并将ContentControl的内容绑定到currentvm属性,并使用带有DataTriggers的DataTemplate(绑定到currentdetailMode)将相应的视图设置为ViewModels。根据这篇文章。
https://rachel53461.wordpress.com/2011/12/18/navigation-with-mvvm-2/
它工作良好,支持细节视图。我使用navigationservice的目标是在一个地方将所有视图或视图模型添加到服务中。不必在每个应该能够显示不同内容/视图的视图模型上创建currentvm和currentdetailmode属性。我更喜欢一个比用特殊的数据触发器手动设置数据模板来支持“细节”视图更简单的解决方案。另外,讨论的导航服务有一个历史队列,因此可以返回。