我在不同的PCL项目上使用具有多个模块的应用程序。我无法在每个模块之间创建依赖关系。因此,我想知道是否可以使用接口从不同模块的ViewModel进行导航。
考虑两个模块(PCL):MyApp.FooModule和MyApp.BarModule。每个模块都有ViewModel,FooModuleViewModel和BarModuleViewModel。接口存储在每个模块引用的另一个PCL projet(例如MyApp.Interfaces)上。您可以在下面看到我的项目依赖项:
MyApp.Droid:MyApp.Interfaces,MyApp.FooModule,MyApp.BarModule
MyApp.FooModule:MyApp.Interfaces
MyApp.BarModule:MyApp.Interfaces
我尝试从FooModuleViewModel导航到BarModuleViewModel,因此在我的应用程序设置中,我想编写如下内容:
Mvx.RegisterType<IBarModuleViewModel, BarModuleViewModel>();
在FooModuleViewModel中:
ShowViewModel<IBarModuleViewModel>();
实际上,当实现该目标时,我会遇到一个异常(由MvxAndroidViewsContainer抛出):
Exception masked KeyNotFoundException: Could not find view for IBarModuleViewModel
有没有办法做到这一点,还是我必须在ShowViewModel方法上使用“真实”类型?
这可以通过一些技术来实现。
首先,您可以使用具体的ViewModel类型,但提供某种IoC驱动的路由,以允许ViewModel查找类型信息-例如
public interface IViewModelLookupService
{
void Register(Type interfaceType, Type concreteType);
Type Lookup(Type interfaceType);
}
然后,可以用以下代码填充该代码的单例实现:
lookupService.Register(typeof(IBarModuleViewModel), typeof(BarModuleViewModel));
然后可以稍后用于显示视图模型:
var type = lookupService.Lookup(typeof(IBarModuleViewModel));
ShowViewModel(type);
另外,此方法的一种变化是使用“enum
或”string
名称而不是接口进行查找。
或者,第二种方法可能是在每个平台上覆盖您的演示者-所有这些都有一个接口:
public interface IMvxViewPresenter
{
void Show(MvxViewModelRequest request);
void ChangePresentation(MvxPresentationHint hint);
}
视图模型请求对象在哪里:https : //github.com/MvvmCross/MvvmCross/blob/v3.1/Cirrious/Cirrious.MvvmCross/ViewModels/MvxViewModelRequest.cs
如果要覆盖此void Show(MvxViewModelRequest request)
方法,则可以使用此方法将任何MvxViewModelRequest
一个接口替换ViewModelType
为具体的接口,例如:
public override Show(MvxViewModelRequest request)
{
if (request.ViewModelType.IsInterface)
{
var concreteType = // TODO - lookup type here...
request = new MvxViewModelRequest(concreteType, request.ParameterValues, request.PresentationValues, request.RequestedBy);
}
base.Show(request)
}
这将需要在每个平台上进行
其他方法也可能... Mvx相当模块化并且确实可以重写-Wiki页面可能会有所帮助-https: //github.com/MvvmCross/MvvmCross/wiki
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句