我一直在跨平台移动项目中使用MvvmCross,并且在MonoTouch项目中有2个不同的视图,这些视图使用相同的共享视图模型,并且不确定如何构建我的代码以使用相同的viewmodel导航到不同的视图MvvmCross。
答案 0 :(得分:11)
MvvmCross平台使用的默认约定是使用反射自动注册所有视图。
这是在基本安装类中完成的 - 在https://github.com/slodge/MvvmCross/blob/master/Cirrious/Cirrious.MvvmCross/Platform/MvxBaseSetup.cs:
中 protected virtual void InitializeViews()
{
var container = this.GetService<IMvxViewsContainer>();
foreach (var pair in GetViewModelViewLookup())
{
Add(container, pair.Key, pair.Value);
}
}
其中GetViewModelViewLookup
将ViewModel类型的字典返回给View类型:
protected virtual IDictionary<Type, Type> GetViewModelViewLookup(Assembly assembly, Type expectedInterfaceType)
{
var views = from type in assembly.GetTypes()
let viewModelType = GetViewModelTypeMappingIfPresent(type, expectedInterfaceType)
where viewModelType != null
select new { type, viewModelType };
return views.ToDictionary(x => x.viewModelType, x => x.type);
}
在通用的iPad / iPhone应用程序中,您偶尔会想要为每个视图模型包含多个视图 - 使用iPad中的一个视图和iPhone中的一个视图。
要做到这一点,现在(实际上只是现在!)一些属性可用于将您的观点标记为“非常规” - 这些是:
MvxUnconventionalViewAttribute
MvxConditionalConventionalViewAttribute
MvxFormFactorSpecificViewAttribute
在这种情况下,最后一个可能就是你想要的 - 你可以使用两个声明如下的视图为MainViewModel实现简单的iPhone / iPad切换:
[MvxFormFactorSpecificView(MvxTouchFormFactor.Phone)]
public class MyIPhoneView : BaseView<MainViewModel>
{
// iphone specific view ...
}
[MvxFormFactorSpecificView(MvxTouchFormFactor.Pad)]
public class MyIPadView : BaseView<MainViewModel>
{
// ipad specific view ...
}
或者,如果您想要一个非常自定义的配置,您可以覆盖所有“基于约定”的行为 - 您可以实现自己的GetViewModelViewLookup
覆盖 - 例如:
protected override IDictionary<Type, Type> GetViewModelViewLookup(Assembly assembly, Type expectedInterfaceType)
{
if (IsIPad)
{
return new Dictionary<Type, Type>()
{
{ typeof(HomeViewModel), typeof(IPadHomeView) },
{ typeof(DetailViewModel), typeof(IPadDetailView) },
{ typeof(AboutViewModel), typeof(SharedAboutView) },
};
}
else
{
return new Dictionary<Type, Type>()
{
{ typeof(HomeViewModel), typeof(IPhoneHomeView) },
{ typeof(DetailViewModel), typeof(IPhoneDetailView) },
{ typeof(AboutViewModel), typeof(SharedAboutView) },
};
}
}
注意最终你可能会认为你需要额外的ViewModel以及iPad应用程序的视图 - 毕竟iPad有一个更大的屏幕 - 在这种情况下你可以手动添加它们。最终,当您的应用程序达到数百万用户时,您甚至可能决定将平板电脑代码完全从电话代码中分离出来 - 但这通常会等到您达到几百万大关...
答案 1 :(得分:0)
另一种方法是继续创建2个ViewModel,但让它们都是抽象ViewModel的子类,如下所示:
FirstViewViewModel : BaseViewModel
SecondViewViewModel : BaseViewModel
使用相应的视图命名:
FirstView.xaml
SecondView.xaml
这样,您就可以在 BaseViewModel 中放置一些共享行为,而2个子类实际上只是满足MvvmCross的视图提取约定。
答案 2 :(得分:0)
我最近开始使用MvvmCross,我正在使用v4.2.1。似乎有些名字已经改变了。我正在使用一个带有以下iPhone和iPad视图的ViewModel:
String[] name = new String[2]{"Ramesh","Suresh"};
@cacheable(value="cacheStorage", key="#????")
public void getSurName(String[] name){}