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 框架开发应用程序。

在 App.cs 中,通过以下行调用 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

而且您始终可以混合使用这些方法。