MvvmCross iPhone 和 iPad 最佳实践

MvvmCross iPhone and iPad best practices

我有一个关于 Xamarin.iOSMvvmCross 的问题。为 iPhone 和 iPad 显示具有相同 ViewModel 但不同 ViewsView 的最佳做法是什么?

如果我将相同的 ViewModel 放到两个 Views 中,我会得到以下异常:

MvvmCross.Platform.Exception.MvxException Problem seen creating View-ViewModel lookup table - you have more than one View registered for the same ViewModels

是创建另一个 ViewModel 的最佳实践,它派生自第一个,然后从 View 如果设备是 iPhone 或 [=28=,则从属地执行不同的逻辑]?

无法为一个 ViewModel 创建两个 ViewMvvmCross,就像其他 MVVM 库一样,使用反射来创建 ViewViewModel 关系的 Dictionary。这是一对一的操作。如果您尝试在您的容器中为单个 ViewModel 注册多个 View,则会抛出一个 MvxException,正如您自己指出的那样。

规避此行为的最简单方法是创建一个新的 ViewModel(和一个新的 View),它仅派生自第一个 ViewModel.

public class ViewModelA
{
    public ViewModelA()
    { 
        // Constructor
    }

    // Properties, Methods, etc.

}

创建 ViewModelA 后,您现在可以创建一个新的 ViewModelB,它派生自前者:

public class ViewModelB : ViewModelA
{
    public ViewModelA() : base() { }
}

您需要使用 MvvmCross 提供给您的 MvxFormFactorSpecific 属性,当您想要针对一个 viewModel 的 iPad 和 iPhone 执行如下操作时

    [MvxFormFactorSpecific(MvxTouchFormFactor.TallPhone)]
    public class ForTallController : MainController {


        public override void ViewDidLoad() {
            base.ViewDidLoad();
        }
........
........


    }
        [MvxFormFactorSpecific(MvxTouchFormFactor.Pad)]
    public class ForiPadController : MainController {

        public override void ViewDidLoad() {
            base.ViewDidLoad();

        }
........
........
    }

    [MvxFormFactorSpecific(MvxTouchFormFactor.Phone)]
        public partial class MainController : MvxViewController {


            public MainController()
                : base("MainController", null) {

            }

    ......
    ......
    }