【问题标题】:PRISM: Is there a way for a View to know which region it is being created for?PRISM:有没有办法让视图知道它是为哪个区域创建的?
【发布时间】:2019-10-04 07:49:16
【问题描述】:

我有一个在应用程序中注册了几个不同区域的视图,每次调用都像

regionManager.RegisterViewWithRegion(regionName, viewType);

然后在需要时由 Prism 以某种方式实例化。是否可以在视图类构造函数中确定视图将被注入到哪个区域?

我试图在几种类似的情况下重用相同的视图,例如,GUI 的视觉效果是相同的,但视图后面的视图模型会以不同的方式实例化。我可以预期这是一个架构上的怪异,但我受到大型应用程序基础架构的限制。我可以影响注册视图的代码,所以如果有一种方法可以传递一些元数据来伴随每个注册,这些元数据可以稍后在实例化期间检索,我可以这样做。

【问题讨论】:

  • 你想要的是否定拥有可重用视图的核心好处,这没有什么意义。如果您需要更改视图(即新区域的新行为),那么您的视图不能正确重用。如果不同地区需要不同的东西,那不是同一个观点吧?
  • 嗯,他有一个可重用的view,而不是可重用的view models,他只想改变view model 取决于地区。
  • 听起来像是模板或视图模型的好候选。实例化适当的视图模型。模板内容到 ui 中。你可以在 Prism 中做到这一点,或者你过去无论如何都可以做到。根据我的经验,Prism 的各种错综复杂的事物经常会阻碍事情的发展,否则如果没有它的所有区域和诸如此类的东西,它就很简单。不管你怎么做,你最好将父级和内容解耦,这样就不必依赖知道它们各自是什么类型了。
  • 实际上,可重用性是这里的关键思想。我有几个地区的 GUI 应该是相似的,并且在每种情况下都适用于不同的业务情况。因此,相同的 GUI,不同的行为。让我很烦恼的是,我必须有单独的视图才能为我实例化不同的虚拟机。这就是为什么我想以某种方式接管虚拟机的实例化——无论是在我获得控制权的视图中,还是在自定义的 ContentLoader(它有其自身的复杂性)中。最后仍然使用单独的视图,但所有内容都被取出到用户控件中,所以 - 现在好了!

标签: c# wpf prism


【解决方案1】:

是否可以在视图类构造函数中确定视图将被注入到哪个区域?

我不知道默认RegionNavigationContentLoader

话虽如此,您不必强制使用默认实现,IRegionNavigationContentLoader.CreateContent 接收完整的NavigationContent,因此您应该能够检测“视图模型影响区域”作为目标并手动创建正确的视图模型(而不是依赖于ViewModelLocator)。

或者,首先查看视图模型,并首先在每个区域中放置一个正确的视图模型,同时它们共享相同的视图。诚然,这可能是对您的应用程序的较大更改,但可能更干净。

【讨论】:

    猜你喜欢
    • 2023-03-10
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多