【问题标题】:How do I obtain a RegionManager object in code-behind for navigation purposes in Prism?如何在代码隐藏中获取 RegionManager 对象以在 Prism 中进行导航?
【发布时间】:2018-09-29 01:30:15
【问题描述】:

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

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

为什么我想在代码隐藏中这样做:

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

【问题讨论】:

  • 请注意,RegionManager 是一个attached property。静态 GetRegionManager 方法是对应的属性获取访问器。
  • 是的,但我不知道它接受的 DependencyProperty 参数是什么。我只是通过它this
  • 我不知道 this 在你的情况下是什么。但是,这并不重要,因为如果之前已在目标元素(通过 SetRegionManager 或在 XAML 中)设置了非空值,则只会获得非空值。我没有使用 Prism 的经验,但我很确定这种方法不是您想要的。

标签: c# wpf prism prism-6


【解决方案1】:

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

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

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

【讨论】:

  • 如果我没听错的话,既然你必须在 ViewModel 上公开可绑定的属性,你不妨在 ViewModel 中连接从 Prism 获取区域管理器的构造函数?
  • 查看我的问题更新。造型不是问题;普通的超链接控件应该可以正常工作。
  • 你能解释一下为什么从控件本身而不是代码后面的视图模型执行导航是可取的吗?我在这里假设您正在使用 MVVM,如果是这样,那么导航通常是视图模型的一个问题。为了实现,您可以在 Hyperlink 控件中实现 ICommandSource 以允许绑定到视图模型中的任意命令,然后无论您使用该控件的任何位置,您都可以绑定到任何合适的 Command/CommandParameter。
  • 这是可取的,因为它使控件独立。请参阅我的 OP 中的最后一段。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-16
    相关资源
    最近更新 更多