使用 Prism 和 IsNavigationTarget 处理嵌套视图,可能返回 false

2023-12-23

I'm trying to find solution for the following problem. I have a WPF app, I used mvvm and prism (most recent version 7) to build it. Here is the draft of the form/dialog I work on: User dialog structure

MainView 有区域 - Region1,我根据树视图中选择的内容将 SubViewA 注入到 Region1 中。该视图表示树项内容。 SubViewA 本身有区域 - Region2,另一个视图 - SubViewB 根据组合框选择注入到 Region2 中。

我使用 INavigationAware 来管理对该区域的注入。

因此,为了将视图注入到区域中,我使用 MainViewModel 中的以下内容:

_regionManager.RequestNavigate(regionName, viewName, callBack, parameters);

在 SubViewAViewModel 中,我实现了 INavigationAware,为了重用创建的视图,我检查是否创建了每个树项的视图。为此,我将一个 treeitemId 添加到参数中,然后在 IsNavigationTarget 方法中检查此 id,如下所示:

bool IsNavigationTarget(NavigationContext navigationContext)
{
    // get id parameter from navigationContext.Parameters
    // check if subviewA for treeitemId was already shown and return true,
    // i use dictionary, where i store ids of all items that were selected in the past
    // otherwise return false.
}

当我想将 SubViewB 注入 SubViewA 的区域 2 时,我使用相同的方法。大多数情况下,当用户更改下拉选择时,会注入新的 SubViewB。

现在我的问题是 - 如果我在 SubViewBViewModel 中使用 INavigationAware 并且 IsNavigationTarget 始终返回 true - 一切都很好。当我尝试重用视图并再次选择返回 true 或 false 的内容时,当我在树视图中选择第二个项目时,出现异常:“具有给定名称的区域已注册” - prism 抱怨region2 已注册。

我知道我可以拥有服务,并在显示视图时始终从服务填充数据,因此我不需要重用视图。但这是一个更学术的问题——解决这个问题的正确方法是什么?

附:我尝试注册作用域区域管理器,但没有成功,我的问题是我不知道创建新作用域管理器的最佳位置以及如何将其注入视图模型。父级的 ViewModel 不是执行此操作的好地方,因为我必须公开视图。如果我尝试使用附加行为,那么区域内容似乎会在调用行为之前更新。

P.S.2 我从pluralsight(由Brian Lagunas)找到了一个例子,他创建了两个shell,但它与我想要实现的目标不同。他在创建窗口时为每个窗口创建新的范围管理器。而且,如果窗口本身具有与上面所示相同的结构,它也会失败。

P.S.3 我观看了 Brian Lagunas 最近的直播,他正在从头开始编写 Outlook,他的方法基于行为,他将某些视图与依赖视图相关联,它工作得很好,但在他的示例中,依赖视图再次不包含区域。

谢谢。


对于那些对细节感兴趣的人,你必须观看以下pluralsight课程:pluralsight.pxf.io/XVxR5 &pluralsight.pxf.io/B6X99。一个是关于多个 shell,另一个是关于选项卡式控制,称为“Prism 问题和解决方案:掌握 TabControl” - 这门课程对我很有帮助。

简而言之,问题是如何在主视图模型中注入作用域区域。为了解决这个问题,我们重写了 ScopedRegionNavigationContentLoader 来控制我们想要注入作用域区域管理器还是我们必须标记接口的全局区域管理器。

我创建了另一个与当前问题类似的问题:请检查使用嵌套视图时 Prism 7 抛出异常 https://stackoverflow.com/questions/63641883/prism-7-throws-and-exception-when-working-with-nested-views。它将为您提供更多详细信息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Prism 和 IsNavigationTarget 处理嵌套视图,可能返回 false 的相关文章

  • 强制 protobuf-net 忽略 IEnumerable/ICollection 接口

    如何让 protobuf net v2 忽略我的类实现 ICollection IEnumerable 等的事实 对于这个特定场景 我只希望序列化标记为 ProtoMember 的字段 我目前正在从使用 protobuf net v1 转换
  • 无法继承形状

    为什么我不能使用继承 a 的类Shapes class http msdn microsoft com en us library ms604615 28v vs 90 29 我需要延长Rectangle具有一些方法的类 但我想以与使用相同
  • TextBlock TextWrapping 不换行 #2

    好吧 那么this https stackoverflow com questions 6625177 textblock textwrapping not wrapping解决方案没有帮助 XAML 在这里
  • 获取 wpf WriteableBitmap 的 DrawingContext

    有没有办法获得DrawingContext 或类似的东西 WriteableBitmap IE 让你调用简单的东西DrawLine DrawRectangle etc 种方法 而不是直接操作原始像素 我发现 Sixlettervariabl
  • 将字符串数组添加到组合框

    我有一个组合框 我想加载一个从方法返回的字符串数组 我目前只是用 for 循环加载它 但我认为应该可以将字符串数组直接分配给组合框 我只是想改进我的代码 我已经做了一些搜索 并且看到了使用数据范围或数据源的答案 但这些似乎都不起作用 我也尝
  • Caliburn.Micro - ShowDialog() 如何关闭对话框?

    EDIT 新信息 刚刚设法让记录器工作 老实说 我不知道 cm 有一个 并且在尝试使用时收到此消息TryClose TryClose requires a parent IConductor or a view with a Close m
  • 使用MVVM时如何将事件参数作为interaction.Trigger中的参数传递?

    基本上我的自定义类中有一个事件 我将使用事件的参数 gt 属性作为该方法的参数来调用自定义类中的特定方法 您可以观察此信息背后的实际代码 instance FileOpening sender e gt CustomClass Method
  • 以编程方式从 Generic.xaml 查找资源

    我正在尝试实施WPF 和 Silverlight 中的样式绑定 摘自本文 http www wintellect com cs blogs jprosise archive 2011 04 19 silverlight 5 s new st
  • 阻止用户取消选择列表框中的项目?

    我有一个列表框 里面有很多项目 用户可以单击某个项目来编辑其内容 如何防止用户取消选择所有项目 即 用户不应该无法选择任何内容 您的情况缺少一个案例 即清除列表后 您将选择列表中不再存在的项目 我通过添加额外的检查来解决这个问题 var l
  • 尝试在 Expression-Blend 4 中打开在 Visual Studio 2010 中创建的 WPF 项目时出现问题

    我在 VS 2010 中创建 WPF 项目 在完成功能性 GUI 的工作后 我想在 Blend 4 中编辑控件模板 但是当我在 Blend 中以 DesignMode 打开项目时 他告诉我 无效的 XAML 在结果窗口中他写道 Window
  • wpf 控件宽度绑定

    我有两个带有内容的边框 第二个边框宽度根据情况而变化 在内容上 我试图将第一个边框绑定到第二个边框宽度 但是 它不起作用 我不确定我错过了什么 有人可以给我一些指导吗 下面是我目前正在尝试的示例
  • 基于动态资源的样式

    看来这样的事情是不允许的 有什么解决办法吗
  • 在 WPF 中以编程方式设置 ComboBox SelectedItem (3.5sp1)

    在安装了 Net Framework 3 5 sp1 的 wpf 应用程序中以编程方式设置 SelectedItem 时 我感到很困惑 我仔细阅读了数百篇文章 主题 但仍然感到困惑 我的xaml
  • 如何提高Canvas渲染性能?

    我必须画很多Shape http msdn microsoft com en us library system windows shapes shape aspx 约 1 20 万 作为 Canvas 2 的子级 我在 WPF 应用程序中
  • 如何使 WPF 中的窗口对鼠标事件不可见?

    我创建了这个类 它非常适合使我的 WPF 应用程序对鼠标事件透明 using System Runtime InteropServices class Win32 public const int WS EX TRANSPARENT 0x0
  • 在WPF中如何添加菜单项事件?

    在我的 WPF 应用程序中 我添加一个菜单 然后在其下添加几个菜单项 例如 我的菜单项之一是 Main Item 然后我在 Main Item 下添加subItem1 subItem2和subItem3 我想单击 subItem1 并执行某
  • 使用 XAML 文件作为矢量图像源

    我希望能够使用矢量图形 最好在 XAML 中定义 作为图像控件的源 就像我当前可以使用 PNG 等光栅图像一样 这样我就可以轻松地混合和匹配位图和矢量图像 如下所示
  • WPF 和 ClickOnce

    MSDN 未将 WPF exe 列为 ClickOnce 支持的应用程序类型 ClickOnce 应用程序是任何 Windows Presentation Foundation xbap Windows 窗体 exe 控制台应用程序 exe
  • MVVM 创建 ViewModel

    有人可以向我解释一下如何为 MVVM 模式创建 ViewModel 我试图理解这里的教程 http msdn microsoft com en us magazine dd419663 aspx http msdn microsoft co
  • 尝试了解使用服务打开对话框

    我已经阅读了有关使用 mvvm 模式打开对话框的讨论 我看过几个使用服务的示例 但我不明白所有部分如何组合在一起 我发布这个问题寻求指导 以了解我应该阅读哪些内容 以更好地理解我所缺少的内容 我将在下面发布我所拥有的内容 它确实有效 但从我

随机推荐

  • IntelliJ IDEA Gradle 项目无法识别/定位 Antlr 生成的源

    我在一个简单的 Kotlin Gradle 项目中使用 Antlr 虽然我的 Gradle 构建正在生成 Antlr 源 但它们不可用于导入到项目中 正如您所看到的 在左侧 正在生成类 Lexer Parser 等 我也配置了这个gener
  • infinispan 树缓存工作错误

    我使用 infinispan 8 2 6 Final 中的树缓存 我有下一个服务 public class TestService public static final String FIRST CACHE firstCache priv
  • 尚未注册“Microsoft.Extensions.Logging.ILogger”类型的服务

    创建了一个空白的 ASP NET Core 2 0 应用程序 在 Startup cs 中 想要记录传入的请求 所以在配置方法中 我使用 Microsoft Extensions Logging ILogger public void Co
  • 无法通过 API 发布到 LinkedIn 群组

    通过 LinkedIn API 向群组发帖时 请遵循此处的 创建群组帖子 示例 https learn microsoft com en us linkedin compliance integrations groups group po
  • C 中的关闭管道文件描述符

    这是代码 int main int fd 2 pipe fd int r fork if r gt 0 parent close fd 0 do a bunch of things else child close fd 1 do a bu
  • 二叉树插入(按顺序排序)

    我已经在互联网上搜索有关此问题的帮助 但我需要帮助 这并不完全是二叉树的普通插入问题 因为我们不能直接处理树结构本身 我的教授自己写了这篇文章 并为我们提供了可以用来编写与二叉树相关的函数的函数 因此 我无法使用节点和指针之类的东西 这也是
  • 服务器错误:获取 pod 日志时出现拨号 tcp i/o 超时错误

    我正在开发 OpenShift Origin 1 1 它使用 kubernetes 作为 docker 容器的编排工具 我正在创建 Pod 但看不到构建日志 user ip master oc get pods NAME READY STA
  • cloudfront 私人限时 url

    我有一个客户想要在线销售教程视频 我已经从 CF 中预览了他的教程 这是公开的 现在我想使用c sdk生成私有的 限时的URL 以允许购买教程的客户在有限的时间内下载它们 确认付款后 我想生成一个 URL 并通过电子邮件将其发送给客户 CF
  • Django:何时使用 QuerySet none()

    刚刚在Django 文档 https docs djangoproject com en dev ref models querysets none 调用 none 将创建一个永远不会返回任何对象的查询集 访问结果时不会执行任何查询 一个
  • 用于匹配 URL 后两部分的正则表达式

    我正在努力找出最好的regex仅匹配 url 中的最后两个字符串 例如与www stackoverflow com我只想匹配stackoverflow com 我遇到的问题是某些字符串可能有大量句点 例如 a abcnewsplus i a
  • 如何实现上个月/下个月按钮并显示当月的日期?

    设想 我有一个费用跟踪 iOS 应用程序 我将费用详细信息视图控制器中的费用存储到表视图 带有获取的结果控制器 中 该表视图显示费用列表以及类别 金额和日期 我的实体 金钱 中确实有一个日期属性 它是支出或收入的父实体 问题 我想要的是基本
  • 为什么数据库复制时从机读取速度比主机快

    在主 从数据库复制中 所有写入都转到主机 所有读取都转到从机 主机将数据复制到从机 当主机将数据复制到从机时 从机必须执行写入操作以锁定该行 从从机读取速度更快 但为什么呢 奴隶should be a lot更快 因为 它写入的数据量与ma
  • 使用 x-www-form-urlencoded 的 HttpClient POST 请求

    我正在尝试发出 POST 请求x www form urlencoded内容类型标头如下 login username password Observable
  • 取消转义 Ruby 字符串中的特殊字符序列

    我正在从包含如下序列的文件加载文本 abc ndef tghi 我想 转义 所有特殊字符 例如来治疗 n作为换行符和 t作为选项卡等 而不是自动以例如 n or t在字符串中 是否有捷径可寻 文本将按照文件中的原样加载 如果文件具有文字文本
  • 403 错误代码 Google Drive Python 已超出此文件的下载配额

    我使用 Google Drive Python 库https developers google com drive v3 web quickstart python step 1 turn on the api name https de
  • WCF REST 请求拦截器身份验证

    我正在尝试在 WCF RequestInterceptor 中进行一些基本身份验证 我在用本文 http msdn microsoft com en us library ee391967 aspx作为一个开始 我遇到的问题是拦截器和服务之
  • 在 Flask 中返回 Excel 文件

    我正在 python 3 中构建一个 Flask 应用程序 我正在尝试写入输出并响应下载 我所做的就是将 sqlite3 db 内容写入 Excel 文件 尝试发送到客户端进行下载 一切似乎都工作正常 直到创建 Excel 文件 我无法发送
  • std::变换和移动语义

    我正在使用 Boost Filesystem 在目录中创建文件列表 我用boost filesystem recursive directory iterator and std copy将每个路径放入 std vector 作为boost
  • 使用一个 UIViewController 和两个 XIB 处理 iPad 上的方向变化

    我想用一个 UIViewController 和两个 XIB 例如 MenuView 和 MenuViewLandscape 来处理 iPad 应用程序上的方向更改 那么 在 MenuViewController 的 willRotateT
  • 使用 Prism 和 IsNavigationTarget 处理嵌套视图,可能返回 false

    I m trying to find solution for the following problem I have a WPF app I used mvvm and prism most recent version 7 to bu