我正在寻找有关如何将多个视图与单个ViewModel关联的一些指导。我们正在开发一个使用Xamarin.Forms Portable(VS.NET 2017)和Caliburn.Micro作为MVVM框架的应用程序。
在App.cs中,通过以下行调用DemoView,一切正常:
现在,问题是我们需要为移动设备和平板电脑加载不同的视图。我在/ Views下创建了一个新的文件夹结构,如下所示: - /Views/Demo/Mobile.xaml - /Views/Demo/Tablet.xaml
问题是如何根据条件(Device.Idiom)加载相关的View,知道需要有一种方法将上述2个视图与DemoViewModel相关联。
这是否意味着我仍然需要一个/Views/DemoView.Xaml(知道它已经与/ViewModels/DemoViewModel.cs相关联)作为中介并根据提到的条件加载正确的View?
我应该标记我们要加载的视图是Tabbed页面,它将在DemoViewModel中加载其他页面(通过将其他ViewModel添加到Items集合中来实现Conductor.Collection.OneActive)。
谢谢, P上。
答案 0 :(得分:2)
您必须设置一些custom conventions。
如果始终需要为手机和平板电脑加载不同的视图,则可以通过配置类型映射来配置Caliburn搜索View或ViewModel的区域。
App.xaml.cs
protected override void Configure()
{
TypeMappingConfiguration config = null;
if( Device.Idiom == TargetIdiom.Tablet)
{
config = new TypeMappingConfiguration
{
DefaultSubNamespaceForViews = "Tablet.Views",
DefaultSubNamespaceForViewModels = "Common.ViewModels"
};
}
else
{
config = new TypeMappingConfiguration
{
DefaultSubNamespaceForViews = "Mobile.Views",
DefaultSubNamespaceForViewModels = "Common.ViewModels"
};
}
if(config != null)
{
ViewLocator.ConfigureTypeMappings(config);
}
}
如果您在惯用语中共享大多数视图,则可以为特定的视图模型指定视图
protected override void Configure()
{
if( Device.Idiom == TargetIdiom.Tablet)
{
ViewLocator.AddNamespaceMapping("Common.ViewModels.Demo", "Tablet.Views");
}
else
{
ViewLocator.AddNamespaceMapping("Common.ViewModels.Demo", "Mobile.Views");
}
}
这将映射
平板电脑:
Common.ViewModels.DemoViewModel
至Tablet.Views.DemoView
移动:
Common.ViewModels.DemoViewModel
至Mobile.Views.DemoView
你可以随时混合使用这些。