2017-08-30 60 views
1

我有一个关于Xamarin.iOSMvvmCross的问题。 iPhone和iPad显示View的最佳做法与ViewModel相同但不同ViewsMvvmCross iPhone和iPad最佳做法

如果我把同样的ViewModel两个Views我得到以下异常:看到创建 视图查看模型查找表

MvvmCross.Platform.Exception.MvxException问题 - 你有一个以上的注册查看 为同一的ViewModels

是创建另一个ViewModel从第一派生,然后从View依赖性,如果执行不同的逻辑的最佳实践该设备是iPhone还是iPad?

回答

2

无法为一个ViewModel创建两个View s。与其他MVVM库一样,MvvmCross使用反射来创建和ViewModel关系的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() { } 
} 
1

您需要使用的是从MvvmCross提供给您MvxFormFactorSpecific属性,当你想目标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) { 

      } 

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