MvvmCross MvxWindowsPage 编译错误

我正在使用MvvmCross框架编写Xamarin.iOSXamarin.AndroidUWP跨平台应用程序。

我正在创建一个具有LoginViewModel的LoginPage。 在Xamarin.iOSXamarin.Android项目中,ViewModel和View的绑定与下面的工作正常

 public class LoginActivity : MvxAppCompatActivity 
 public partial class LoginViewController : MvxViewController 

尝试在UWP项目上执行与上面相同的操作,我收到一些错误。

在XAML中:

  

我的C#代码是

 public sealed partial class LoginView : MvxWindowsPage 

但我得到编译错误。 我该如何解决?

  • 元素’MvxWindowsPage’上的’未知成员’TypeArguments’
  • 名称“LoginViewModel”在命名空间“using:MyApp.PresentationCore.ViewModels”中不存在。
  • ‘MvvmCross.WindowsUWP.Views.MvxWindowsPage`1 [TViewModel]’上的GenericArguments [0],’System.Object’违反了’TViewModel’类型的约束。

我认为错误有点模棱两可,因为在第一个错误中没有模板化版本,但第三个错误是关于模板约束违规。

我知道有一个选项将ViewModel和View绑定到命名约定或属性,但我想使用这种强类型解决方案。

不幸的是,我认为UWP不支持TypeArguments ,也不支持基页的generics类型参数。 您可以在他们讨论的地方查看Prism GitHub线程 。 因此,您必须使用其他注册选项之一。


Mvvmcross提供了各种替代方法,用于将View注册到ViewModel 。 在Mvvmcross初始化期间,它将尝试按以下顺序使用MvxViewModelViewTypeFinderViewModel注册到View

基于属性的注册:

您可以将MvxViewFor属性添加到页面类中。

 [MvxViewFor(typeof(FirstViewModel))] public sealed partial class FirstView : MvxWindowsPage { public FirstView() { this.InitializeComponent(); } } 

基于混凝土类型的注册

您可以通过指定ViewModel的具体类型将View注册到ViewModel。

 public sealed partial class FirstView : MvxWindowsPage { public new FirstViewModel ViewModel => base.ViewModel as FirstViewModel; public FirstView() { this.InitializeComponent(); } } 

或者在Android和iOS的情况下,可以使用通用基类:

 // Android public class FirstActivity : MvxAppCompatActivity // iOS public class FirstViewController : MvxViewController 

基于公约的登记:

您可以让您的视图和ViewModel遵循相同的命名约定,Mvvmcross将为您映射它们(xxxView和xxxViewModel)

视图

 public sealed partial class FirstView : MvxWindowsPage { public FirstView() { this.InitializeComponent(); } } 

视图模型

 public class FirstViewModel : MvxViewModel