MvvmCross iPhone 和 iPad 最佳实践
MvvmCross iPhone and iPad best practices
我有一个关于 Xamarin.iOS
和 MvvmCross
的问题。为 iPhone 和 iPad 显示具有相同 ViewModel
但不同 Views
的 View
的最佳做法是什么?
如果我将相同的 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
创建两个 View
。 MvvmCross
,就像其他 MVVM 库一样,使用反射来创建 View
和 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() { }
}
您需要使用 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) {
}
......
......
}
我有一个关于 Xamarin.iOS
和 MvvmCross
的问题。为 iPhone 和 iPad 显示具有相同 ViewModel
但不同 Views
的 View
的最佳做法是什么?
如果我将相同的 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
创建两个 View
。 MvvmCross
,就像其他 MVVM 库一样,使用反射来创建 View
和 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() { }
}
您需要使用 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) {
}
......
......
}