MvvmCross MvxWindowsPage< TViewModel>编译错误
本文关键字:编译 错误 TViewModel MvxWindowsPage MvvmCross | 更新日期: 2023-09-27 18:13:49
我正在用MvvmCross框架编写Xamarin.iOS
, Xamarin.Android
和UWP
的跨平台应用程序。
我正在制作一个LoginPage,它有一个LoginViewModel。在Xamarin.iOS
, Xamarin.Android
项目中,ViewModel和下面的视图的绑定工作得很好
public class LoginActivity : MvxAppCompatActivity<LoginViewModel>
public partial class LoginViewController : MvxViewController<LoginViewModel>
尝试做同样的UWP
项目,我得到一些错误。
:
<views:MvxWindowsPage
x:TypeArguments="viewModels:LoginViewModel" x:Class="MyApp.UWP.Views.LoginView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:views="using:MvvmCross.WindowsUWP.Views"
xmlns:viewModels="using:MyApp.PresentationCore.ViewModels"
mc:Ignorable="d">
我的c#代码是
public sealed partial class LoginView : MvxWindowsPage<LoginViewModel>
但是我得到编译错误。我该如何解决这些问题?
- 元素'MvxWindowsPage'上的'未知成员'TypeArguments'
- 名称"LoginViewModel"在命名空间"using:MyApp.PresentationCore.ViewModels"中不存在。
- GenericArguments[0],"系统。对象',在'MvvmCross.WindowsUWP.Views '上。MvxWindowsPage ' 1[TViewModel]'违反了TViewModel类型的约束。
我认为这些错误有点模棱两可,因为在第一个错误中没有模板化的版本,但是第三个错误是关于模板约束的违反。
我知道有一个选项绑定ViewModel和视图与命名约定或属性,但我想使用这种强类型的解决方案。
不幸的是,我认为UWP不支持TypeArguments
和随后的基页泛型类型参数。你可以查看Prism的GitHub线程,在那里他们讨论了这个问题。因此,您将不得不使用其他注册选项之一。
Mvvmcross提供了将View
注册到ViewModel
的各种替代方法。在Mvvmcross初始化期间,它将尝试使用MvxViewModelViewTypeFinder
按以下顺序将ViewModel
注册到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<FirstViewModel>
// iOS
public class FirstViewController : MvxViewController<FirstViewModel>
公约建立登记:
你可以让你的视图和ViewModel遵循相同的命名约定,Mvvmcross会为你映射它们(xxxView和xxxViewModel)
<<p> 视图/em>public sealed partial class FirstView : MvxWindowsPage
{
public FirstView()
{
this.InitializeComponent();
}
}
ViewModel
public class FirstViewModel : MvxViewModel