wpf - 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 作为多个视图的数据上下文)。
问题
如上所述使用 ViewModel 第一个 NavigationService 时,是否有一种简单的方法来显示详细视图(共享 ViewModel)而无需重复代码?
如果 View first navigationservice 与链接中的代码完全一样。有没有办法让 Frame 继承正确的数据上下文和样式(根本不运行沙盒)?
如果元素位于 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 以支持“详细信息”视图。此外,所讨论的导航服务有一个历史队列,因此可以返回。
解决方案
我设法解决/回答了我自己的问题
只需为 Detail 视图创建一个哑 ViewModel 类,为其提供 (Main)ViewModel 实例并将该 ViewModel 实例设为属性,以便您可以绑定到它。完毕!毕竟很容易,并且通过依赖注入它可以成为一种呼吸。
我解决了这个问题并在以下单独的问题中对其进行了跟踪。在此处查看答案 WPF ViewBox 阻止 VisualTreeHelper 搜索
推荐阅读
- tensorflow-serving - 在 TensorFlow 服务映像上运行 Docker 时遇到错误
- javascript - 事件未在动态生成的按钮中触发
- mongodb - 如何在 MongoDb 中导入具有集合之间关系的记录?
- node.js - 从 ClientFunction 中访问全局变量
- java - 如果更改,Java 将同步阻塞?
- ruby-on-rails - 带有 Action Cable 的 Rails 是否在 Puma 前使用 NGiNX 代理运行?
- javascript - 在 vscode 中,如何编写表达式以在调试时查看对象的属性值?
- json - 如何在ajax调用中接收和解析从一个jsp页面获取到另一个jsp页面的json数据?
- azure - SQL Server 的 Azure VM 诊断未显示在日志分析中
- css - 在 Angular 7 运行时动态生成 CSS 类