如何在代码隐藏中获取区域管理器对象,以便在 Prism 中进行导航?



我想创建一个自定义超链接控件,单击该控件时,将导航到由绑定到父 ViewModel 中的属性指定的区域和参数。 由于我希望能够将此控件放入任何任意 xaml 中,因此它不能有自己的 ViewModel 或模块管理器,这通常是获取区域管理器的方式。

有没有办法在代码隐藏中获取RegionManager对象,而不必将其注入 ViewModel? 我看到RegionManager类上有一个静态GetRegionManager()方法,但它需要一个我不明白如何使用的依赖项属性参数。

为什么我想在代码隐藏中执行此操作:

虽然我当然可以提供允许将RegionManager对象注入 ViewModel 的构造函数,但我希望我的新超链接控件比这更加独立和独立。 以这种方式涉及 ViewModel 意味着导航将在 ViewModel 中进行,而不是在新的超链接控件中进行,这有点违背了拥有独立超链接控件的目的。

听起来你想要一些具有按钮行为的东西,但有一个超链接的外观。 如果是这样,我建议使用现有的 WPF 按钮控件并适当地设置其样式以使其看起来像超链接。

如果这符合您的目的,那么无论您在哪里使用该控件,都可以将其绑定到那里使用的任何视图模型中的命令。 每个视图模型都可以有一个 IRegionManager(例如,通过构造函数注入),您可以使用 IRegionManager.RequestNavigate 来执行任何合适的导航。

作为附带好处,将逻辑保留在视图模型中可以更轻松地对其进行测试。 例如,单元测试可以调用视图模型上的命令,并验证是否使用适当的参数调用了 IRegionManager.RequestNaving。

您可以随时使用CommonServiceLocator,但这只是邪恶。此外,您希望在视图模型(而不是视图中)中进行导航,以使其可测试。如果不是因为这个,你可以完全删除 mvvm。

拥有一个HyperLinkViewModel(接受IRegionManager并具有相关的DataTemplate和/或ControlTemplate)对我来说看起来非常独立,顺便说一句。只需将其公开为另一个视图模型中的属性,您就会有一个有效的超链接。

视图模型在某种程度上是DataTemplate的代码隐藏。

最新更新