C# 如何在Prism中获得代码隐藏中的RegionManager对象以用于导航?

C# 如何在Prism中获得代码隐藏中的RegionManager对象以用于导航?,c#,wpf,prism,prism-6,C#,Wpf,Prism,Prism 6,我想创建一个自定义超链接控件,当单击该控件时,它将导航到由父视图模型中的属性绑定指定的区域和参数。由于我希望能够将此控件放入任意xaml中,因此它不能有自己的ViewModel或Module Manager,这通常是获得区域管理器的方式 有没有一种方法可以在代码隐藏中获取RegionManager对象,而不必将其注入到ViewModel中?我看到在RegionManager类上有一个静态的GetRegionManager()方法,但是它使用了一个我不知道如何使用的依赖属性参数 为什么我想在代码隐

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

有没有一种方法可以在代码隐藏中获取
RegionManager
对象,而不必将其注入到ViewModel中?我看到在
RegionManager
类上有一个静态的
GetRegionManager()
方法,但是它使用了一个我不知道如何使用的依赖属性参数

为什么我想在代码隐藏中这样做:
虽然我当然可以提供允许将
RegionManager
对象注入ViewModel的构造函数,但我希望我的新超链接控件更加独立。以这种方式涉及ViewModel意味着导航将在ViewModel中进行,而不是在新的超链接控件中进行,这在某种程度上违背了拥有一个自包含超链接控件的目的。

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

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


另一个好处是,将逻辑保留在viewmodel中可以使其更易于测试。例如,单元测试可以调用viewmodel上的命令,并验证是否使用适当的参数调用了IRegionManager.RequestNavigate。

您始终可以使用
CommonServiceLocator
,但这是错误的。此外,您希望导航发生在视图模型中(而不是视图中),只是为了使其可测试。如果不是这样,您可以完全放弃mvvm

顺便说一句,拥有一个
HyperLinkViewModel
(它接收一个
IRegionManager
,并且有一个关联的
DataTemplate
和/或
ControlTemplate
)在我看来是非常独立的。只需将它作为另一个视图模型的属性公开,您就有了一个工作的超链接


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

因此,如果我没听错的话,因为您必须在视图模型上公开可绑定属性,您最好在视图模型中连接从Prism获取区域管理器的构造函数。请参阅我的问题更新。造型不是问题;一个普通的超链接控件应该可以正常工作。你能澄清一下为什么需要从控件本身而不是代码背后的viewmodel执行导航吗?我在这里假设您使用的是MVVM,如果是,那么导航通常是viewmodel关心的问题。对于实现,您可以在超链接控件中实现ICommandSource以允许绑定到viewmodel中的任意命令,然后无论您在何处使用该控件,都可以绑定到任何适当的命令/命令参数。这是可取的,因为它使控件自包含。请参见我文章的最后一段。请注意,RegionManager是一个。静态GetRegionManager方法是相应的属性get accessor。是的,但我不知道它接受的DependencyProperty参数是什么。我能把它传给你吗?我不知道你的情况是什么。但是,这并不重要,因为只有在目标元素(由SetRegionManager或在XAML中)上设置过非null值时,才会获得该值。我没有使用棱镜的经验,但我很确定这种方法不是你想要的。