viewdestroy supported platforms mvxasynccommand c# xaml xamarin uwp mvvmcross

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.