为同一个 ViewModel 绑定两个不同的视图

Bind Two Different Views for same ViewModel

这看起来类似于 MVVMCross - Bind the same ViewModel to 2 different Views

但在那之后我没有得到答案,我如何才能 select ViewModel 的一个 View 和另一个 ViewModel 的第二个 View。

例如,我想要一个 ViewModel - LoginViewModel 和两个视图:PhoneLoginPage & TabletLoginPage.

根据 Xamarin.Forms.Device.Idiom 的信息,当它是 Phone 我想显示 PhoneLoginPage 但当它是平板电脑时 - TabletLoginPage 但具有相同的 LoginViewModel 与他们绑定。

如何正确实现?意思是,没有任何卑鄙的把戏...

谢谢

注意:我也支持只有一页。

但我将如何处理两个页面:

如果您使用某种导航服务:

只需根据设备的惯用语在应用程序启动时注册不同的页面。

按照:

if(Device.Idiom == TargetIdiom.Tablet)
{
    SomeNavigationService.Register<LoginViewModel, TabletLoginPage>();
}
else
{
    SomeNavigationService.Register<LoginViewModel, PhoneLoginPage>();
}

如果您在页面代码隐藏中进行导航

根据设备的习语选择页面...

if(Device.Idiom == TargetIdiom.Tablet)
{
    await Navigation.PushAsync(new TabletLoginPage(viewModel));
}
else
{
    await Navigation.PushAsync(new PhoneLoginPage(viewModel));
}

使用 MvvmCross 这是不可能的,在运行时,如果我们为同一个 ViewModel 创建两个视图,我们将得到一个异常。

接下来是我的解决方案:

<ProjectFolder>
    => Pages
        => Mobile
            XMobilePage.xaml
            YMobilePage.xaml
        => Tablets
            XTabletPage.xaml
            YTabletPage.xaml
    => PageModels
        => Mobile
            XMobilePageModel.cs
            YMobilePageModel.cs
        => Tablets
            XTabletPageModel.cs
            YTabletPageModel.cs

class XMobilePage: MvxContentPage<XMobilePageModel> {...}

class XTabletPage: MvxContentPage<XTabletPageModel> {...}

abstract SharedXPageModel
{
    //All Shared Commands and Comand Logic and other shared initialization
    abstract Task NavigateToYPageModel();
}

class XMobilePageModel : SharedXPageModel
{
    Task NavigateToYPageModel() => _mvxNavigationService.Navigate<YMobilePageModel>();
}

class XTabletPageModel : SharedXPageModel
{
    Task NavigateToYPageModel() => _mvxNavigationService.Navigate<YTabletPageModel>();
}