c# - supported - Error de compilación de MvvmCross MvxWindowsPage<TViewModel>
mvxasynccommand (1)
Desafortunadamente, creo que UWP no es compatible con TypeArguments
y, posteriormente, con los parámetros de tipos genéricos para las páginas base. Puedes consultar el hilo Prism GitHub donde lo debatan. Entonces deberá ir con una de las otras opciones de registro.
Mvvmcross ofrece varios enfoques alternativos para registrar su View
en un ViewModel
. Durante la inicialización de Mvvmcross, intentará registrar su ViewModel
a su View
utilizando MvxViewModelViewTypeFinder
en el siguiente orden:
Registro basado en atributos:
Puede agregar el atributo MvxViewFor
a su clase de página.
[MvxViewFor(typeof(FirstViewModel))]
public sealed partial class FirstView : MvxWindowsPage
{
public FirstView()
{
this.InitializeComponent();
}
}
Registro basado en el tipo de concreto:
Puede registrar su View
en su ViewModel
especificando el tipo concreto de ViewModel.
public sealed partial class FirstView : MvxWindowsPage
{
public new FirstViewModel ViewModel => base.ViewModel as FirstViewModel;
public FirstView()
{
this.InitializeComponent();
}
}
O en el caso de Android e iOS donde se puede usar la clase base genérica:
// Android
public class FirstActivity : MvxAppCompatActivity<FirstViewModel>
// iOS
public class FirstViewController : MvxViewController<FirstViewModel>
Registro basado en la convención:
Puede tener su vista y ViewModel seguir la misma convención de nomenclatura y Mvvmcross los mapeará (xxxView y xxxViewModel)
Ver
public sealed partial class FirstView : MvxWindowsPage
{
public FirstView()
{
this.InitializeComponent();
}
}
ViewModel
public class FirstViewModel : MvxViewModel
Estoy escribiendo una Xamarin.iOS
Xamarin.Android
Xamarin.iOS
, Xamarin.Android
y UWP
con el framework MvvmCross.
Estoy haciendo una página de inicio de sesión que tiene un LoginViewModel. En los proyectos de Xamarin.iOS
, Xamarin.Android
, la vinculación de ViewModel y la vista con la siguiente funciona bien
public class LoginActivity : MvxAppCompatActivity<LoginViewModel>
public partial class LoginViewController : MvxViewController<LoginViewModel>
Tratando de hacer lo mismo que el anterior en el proyecto UWP
, recibo un error.
En 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">
Y mi código de C # es
public sealed partial class LoginView : MvxWindowsPage<LoginViewModel>
Pero tengo errores de compilación. ¿Cómo puedo resolverlos?
- `Miembro desconocido ''TypeArguments'' en el elemento ''MvxWindowsPage''
- El nombre "LoginViewModel" no existe en el espacio de nombres "using: MyApp.PresentationCore.ViewModels".
- GenericArguments [0], ''System.Object'', en ''MvvmCross.WindowsUWP.Views.MvxWindowsPage`1 [TViewModel]'' infringe la restricción de tipo ''TViewModel''.
Creo que los errores son un poco ambiguos porque en el primer error no hay una versión con plantilla, pero el tercer error es sobre una violación de restricción de plantilla.
Sé que hay una opción que vincula ViewModel y View con la convención o los atributos de nomenclatura, pero me gustaría utilizar esta solución fuertemente tipada.