Pasar variables de ViewModel a otra vista (MVVMCross)

Durante las últimas semanas he estado trabajando en el desarrollo de una aplicación multiplataforma (IOS / Android / WP7) utilizando el marco MVVMCross. Hoy me encontré con un problema que realmente no sé cómo resolver, así que espero que puedas empujarme en la dirección correcta.

En el IOS tengo la siguiente construcción para navegar a otra página (el código a continuación se encuentra en un ViewModel):

KeyValuePair kvpAct1 = new KeyValuePair("short", ".countertest5"); public IMvxCommand BeckhoffActuator1 { get { return new MvxRelayCommand((type) => this.RequestNavigate(kvpAct1)); } } 

Cuando se dispara este IMvxCommand (botón presionado) se carga la siguiente Vista, en este caso el BeckhoffActuatorViewModel. En el código de BeckhoffActuatorView, uso el par de valores clave de arriba:

 public class BeckhoffActuatorView : MvxTouchDialogViewController { ICollection icol; public BeckhoffActuatorView(MvxShowViewModelRequest request) : base(request, UITableViewStyle.Grouped, null, true) { icol = request.ParameterValues.Values; } public override void ViewDidLoad() { //Code } } 

Esta construcción funciona bien en iOS, pero me gustaría usar la misma construcción en mi aplicación para Android.

El código en el ViewModel no ha cambiado, ya que esa es toda la idea de MVVM. Pero el código del BackhoffActuatorView es diferente para Android:

 public class BeckhoffActuatorView : MvxBindingActivityView { public ICollection icol; public BeckhoffActuatorView() { Debug.WriteLine("Standard"); } public BeckhoffActuatorView(MvxShowViewModelRequest request) { Debug.WriteLine("Custom"); icol = request.ParameterValues.Values; } protected override void OnViewModelSet() { SetContentView(Resource.Layout.BeckhoffActuatorView); } } 

El código anterior no funciona, el MvxBindingActivityView no parece implementar algo similar al ViewController que uso en IOS. El código solo viene en el constructor estándar, y cuando lo dejo por completo no se comstack / ejecuta.

¿Alguien sabe que puedo acceder al par de valores de clave que envío con RequestNavigate? ¡Gracias!

MVVMCross está muy basado en convenciones, y funciona en la idea de pasar mensajes entre ViewModels siempre que sea posible.

Si navegas a un ViewModel usando:

 KeyValuePair kvpAct1 = new KeyValuePair("short", ".countertest5"); public IMvxCommand BeckhoffActuator1 { get { return new MvxRelayCommand((type) => this.RequestNavigate(kvpAct1)); } } 

entonces deberías poder recoger eso en el BeckhoffActuatorViewModel usando el constructor:

 public class BeckhoffActuatorViewModel : MvxViewModel { public BeckhoffActuatorViewModel(string short) { ShortValue = short; } private string _shortValue; public string ShortValue { get { return _shortValue; } set { _shortValue = value; FirePropertyChanged("ShortValue"); } } } 

Y sus vistas pueden acceder a ViewModel.ShortValue (para iOS, esto se puede hacer después de base.ViewDidLoad (), para Android después de OnCreate () y para WP7 después de OnNavigatedTo)

Para ver un ejemplo de esto, eche un vistazo al ejemplo de TwitterSearch:

Esto tiene un HomeViewModel que navega usando:

  private void DoSearch() { RequestNavigate(new { searchTerm = SearchText }); } 

y un TwitterViewModel que recibe el searchTerm usando el constructor:

  public TwitterViewModel(string searchTerm) { StartSearch(searchTerm); } 

Tenga en cuenta que solo las string s están permitidas en este mensaje que pasa actualmente, pero siempre puede serializar sus propios objetos utilizando JSON.Net, o puede ampliar el marco, es de código abierto.

Tenga en cuenta que solo las string s, int s, double s y bool s están permitidas en este parámetro de constructor que pasa actualmente, esto se debe a los requisitos de serialización para las URL de Xaml y para los bashs de Android. Si desea experimentar con la navegación utilizando sus propios objetos serializados personalizados, consulte http://slodge.blogspot.co.uk/2013/01/navigating-between-viewmodels-by-more.html .

Además, tenga en cuenta que si desea utilizar la navegación anónima de objetos ( RequestNavigate(new { searchTerm = SearchText }); ) deberá asegurarse de que se haya establecido un atributo InternalsVisibleTo (consulte https://github.com). /slodge/MvvmCrossTwitterSearch/blob/master/TwitterSearch.Core/Properties/AssemblyInfo.cs :

 [assembly: InternalsVisibleTo("Cirrious.MvvmCross")] 

Además … no para los débiles de corazón … y esto no es un “buen código de mvvm” … pero si realmente quiere / necesita acceder a los datos de MvxShowViewModelRequest dentro de una actividad de Android, entonces puede extraerlos de la Intención entrante: hay una cadena Extras que contiene la solicitud (consulte la deserialización en CreateViewModelFromIntent en https://github.com/slodge/MvvmCross/blob/master/Cirrious/Cirrious.MvvmCross/Android/Views/MvxAndroidViewsContainer.cs )