Navigation Prism'的解决方案;s请求导航查看注册详细信息?
我将prism与RequestNavigate方法一起使用 我遇到的问题是,我必须向容器注册所有ViewModels:Navigation Prism'的解决方案;s请求导航查看注册详细信息?,navigation,prism,Navigation,Prism,我将prism与RequestNavigate方法一起使用 我遇到的问题是,我必须向容器注册所有ViewModels: container.RegisterType<object, InboxView>("InboxView"); container.RegisterType(“InboxView”); 这非常冗长,需要一个我要注册的所有视图类型的列表。 有什么解决办法吗 我认为RequestNavigate应该是通用的: IRegion.RequestNavigate<T
container.RegisterType<object, InboxView>("InboxView");
container.RegisterType(“InboxView”);
这非常冗长,需要一个我要注册的所有视图类型的列表。有什么解决办法吗 我认为RequestNavigate应该是通用的:
IRegion.RequestNavigate<TView>();
IRegion.RequestNavigate();
并应执行以下操作:
typeof(TView)。name
我知道您想得到什么,但建议的解决方案并没有真正达到RegionManager的设计目标。特别是:
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)));
}
}