Navigation Prism'的解决方案;s请求导航查看注册详细信息?

Navigation Prism'的解决方案;s请求导航查看注册详细信息?,navigation,prism,Navigation,Prism,我将prism与RequestNavigate方法一起使用 我遇到的问题是,我必须向容器注册所有ViewModels: container.RegisterType<object, InboxView>("InboxView"); container.RegisterType(“InboxView”); 这非常冗长,需要一个我要注册的所有视图类型的列表。 有什么解决办法吗 我认为RequestNavigate应该是通用的: IRegion.RequestNavigate<T

我将prism与RequestNavigate方法一起使用

我遇到的问题是,我必须向容器注册所有ViewModels:

container.RegisterType<object, InboxView>("InboxView");
container.RegisterType(“InboxView”);
这非常冗长,需要一个我要注册的所有视图类型的列表。
有什么解决办法吗

我认为RequestNavigate应该是通用的:

IRegion.RequestNavigate<TView>();
IRegion.RequestNavigate();
并应执行以下操作:

  • 解析视图
  • 在区域中为视图指定一个名称,该名称应为
    typeof(TView)。name
  • 执行实际的导航请求:)
  • 请投票支持Prism问题列表中的摘要

  • 我知道您想得到什么,但建议的解决方案并没有真正达到RegionManager的设计目标。特别是:

  • 区域请求与类型无关。如果您在模块B中没有对模块a中的某个类型的引用,但希望在那里导航,那么在没有这些模块相互引用或将这些类型重构为第三个程序集的情况下,您如何导航
  • 区域可以根据需要具有任意多个特定类型的视图。您提出的解决方案将人为地将特定类型的视图数量限制为一个,而这不是区域当前的工作方式
  • 但这并不能回答你的问题

    至于减少冗长,除了在RegionManager面前推出自己的解决方案来封装您想要的行为之外,您没有什么可以做的。就我个人而言,我不会走这条路,但这肯定是你可以做的。您可以将其作为自己的服务编写,也可以在IRegionManager或IRegion上编写一个扩展方法

    public interface IMyNavigationService
    {
         //Your own implementation could use (typeof(T)).Name (or 
         //AttributedModelServices.GetContractName(typeof(T)) if using MEF)
         //as the Key, if thatis appropriate for your solution 
         //(1 instance T per region and references to T from all Modules)
         void RequestNavigation<T>();
    }
    
    您可以在此处提供合同名称(
    [Export(“InboxView”)]
    ),但默认情况下,它将提供合同名称
    AttributedModelServices.GetContractName(typeof(InboxView))
    。只要您选择的内容与您在IMyNavigationService实现中选择生成名称的方式一致,它就可以正常工作

    这是同样的事情,但是使用扩展方法实现(使用MEF实现…如果使用Unity,您可以选择其他密钥生成方法…您只需在方法中添加该类型的注册)

    公共静态类RegionExtensions
    {
    公共静态无效请求导航(此IRegion区域)
    {
    region.RequestNavigate(AttributedModelServices.GetContractName(typeof(T));
    }
    }
    
    如果你对把所有东西都换成MEF感到紧张,有一种方法可以让这更容易。。。它基本上将Unity和MEF结合在一起


    希望这会有所帮助。

    您的问题是必须注册所有视图模型还是所有视图?你的例子不清楚这一点。除此之外,不需要将映射名“InboxView”作为RegisterType的参数。@PVitt,是的。这是我的问题。我希望这些映射是自动化的,实际上我正在考虑通过对区域进行子类化,覆盖或隐藏RequestNavigate方法,在那里添加视图注册(一个IUnityContainer将被注入到它的构造函数中),您认为呢?顺便说一句,我已经在Prism codeplex网站上发布了一篇文章,请审阅/投票。@Shimmy:对于具体类型,您不必使用RegisterType来允许容器实例化它。但是,由于某些原因,您正在将实例化“object”类型对象的所有请求映射到InboxView类型。我会直言不讳地说,如果你必须这么做,那就是你做错了。@Shimmy发布了一个完整的样本,这样我们就可以看一看,并为你指出正确的方向。@Anderson Imes。请相信我,我也讨厌将视图类型注册到
    对象
    ,这确实很糟糕。但是,看一看(查看“重要”部分和之前的一小部分),你会发现它是必要的,不幸的是没有错。
    [Export]
    public class InboxView { .. }
    
    public static class RegionExtensions
    {
        public static void RequestNavigate<T>(this IRegion region)
        {
            region.RequestNavigate(AttributedModelServices.GetContractName(typeof(T)));
        }
    }