MvvmCross MvxWindowsPage< TViewModel>编译错误

本文关键字:编译 错误 TViewModel MvxWindowsPage MvvmCross | 更新日期: 2023-09-27 18:13:49

我正在用MvvmCross框架编写Xamarin.iOS, Xamarin.AndroidUWP的跨平台应用程序。

我正在制作一个LoginPage,它有一个LoginViewModel。在Xamarin.iOS, Xamarin.Android项目中,ViewModel和下面的视图的绑定工作得很好

public class LoginActivity : MvxAppCompatActivity<LoginViewModel> 
public partial class LoginViewController : MvxViewController<LoginViewModel>  

尝试做同样的UWP项目,我得到一些错误。

在XAML

:

<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和视图与命名约定或属性,但我想使用这种强类型的解决方案。

MvvmCross MvxWindowsPage< TViewModel>编译错误

不幸的是,我认为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