Xamarin.Forms Caliburn.Micro - 将多个视图与单个 ViewModel 相关联
Xamarin.Forms Caliburn.Micro - Associate multiple Views with a single ViewModel
我正在寻找有关如何将多个视图与单个 ViewModel 相关联的指导。我们正在使用 Xamarin.Forms 便携式(VS.NET 2017)和 Caliburn.Micro 作为 MVVM 框架开发应用程序。
- 视图将显示为 /Views/DemoView。Xaml
- ViewModel 将显示为 /ViewModels/DemoViewModel.cs
在 App.cs 中,通过以下行调用 DemoView,一切正常:
- DisplayRootView<(DemoView)>();
现在,问题是我们需要为手机和平板电脑加载不同的视图。我在 /Views 下创建了一个新的文件夹结构,如下所示:
- /Views/Demo/Mobile.xaml
- /Views/Demo/Tablet.xaml
问题是如何根据条件加载相关的View(Device.Idiom),知道需要有办法将上面2个view和DemoViewModel关联起来
这是否意味着我仍然需要一个 /Views/DemoView.Xaml(知道它已经关联到 /ViewModels/DemoViewModel.cs)作为中介并加载正确的根据提到的条件查看?
我应该标记我们寻求加载的视图是选项卡式页面,它将通过将其他 ViewModel 添加到 Items 集合来在 DemoViewModel(实现 Conductor.Collection.OneActive)中加载其中的其他页面。
谢谢,
P.
您将需要设置一些 custom conventions。
如果您总是需要为phone和平板电脑加载不同的视图,那么您可以通过配置Type来配置Caliburn搜索View或ViewModels的区域映射。
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");
}
}
这将映射
Tablet: Common.ViewModels.DemoViewModel
to Tablet.Views.DemoView
Mobile: Common.ViewModels.DemoViewModel
to Mobile.Views.DemoView
而且您始终可以混合使用这些方法。
我正在寻找有关如何将多个视图与单个 ViewModel 相关联的指导。我们正在使用 Xamarin.Forms 便携式(VS.NET 2017)和 Caliburn.Micro 作为 MVVM 框架开发应用程序。
- 视图将显示为 /Views/DemoView。Xaml
- ViewModel 将显示为 /ViewModels/DemoViewModel.cs
在 App.cs 中,通过以下行调用 DemoView,一切正常:
- DisplayRootView<(DemoView)>();
现在,问题是我们需要为手机和平板电脑加载不同的视图。我在 /Views 下创建了一个新的文件夹结构,如下所示: - /Views/Demo/Mobile.xaml - /Views/Demo/Tablet.xaml
问题是如何根据条件加载相关的View(Device.Idiom),知道需要有办法将上面2个view和DemoViewModel关联起来
这是否意味着我仍然需要一个 /Views/DemoView.Xaml(知道它已经关联到 /ViewModels/DemoViewModel.cs)作为中介并加载正确的根据提到的条件查看?
我应该标记我们寻求加载的视图是选项卡式页面,它将通过将其他 ViewModel 添加到 Items 集合来在 DemoViewModel(实现 Conductor.Collection.OneActive)中加载其中的其他页面。
谢谢, P.
您将需要设置一些 custom conventions。
如果您总是需要为phone和平板电脑加载不同的视图,那么您可以通过配置Type来配置Caliburn搜索View或ViewModels的区域映射。
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");
}
}
这将映射
Tablet:
Common.ViewModels.DemoViewModel
toTablet.Views.DemoView
Mobile:
Common.ViewModels.DemoViewModel
toMobile.Views.DemoView
而且您始终可以混合使用这些方法。