viewdestroy supported standard platforms net example c# android xamarin.ios xamarin.android mvvmcross

c# - supported - Pasar variables de ViewModel a otra Vista(MVVMCross)



mvvmcross xamarin (1)

MVVMCross está basado en la convención, y funciona con la idea de pasar mensajes entre ViewModels siempre que sea posible.

Si navega a un ViewModel usando:

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

entonces deberías poder recoger eso en 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 un ejemplo de esto, eche un vistazo al ejemplo de TwitterSearch:

Esto tiene un HomeViewModel que llama navegando usando:

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

y un TwitterViewModel que recibe el término de búsqueda usando el constructor:

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

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

Tenga en cuenta que solo string s, int s, double s y bool s están permitidas en este parámetro de constructor que pasa en la actualidad; esto se debe a los requisitos de serialización para Xaml Urls y para Android Intents. 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 el objeto anónimo de navegación ( RequestNavigate<TwitterViewModel>(new { searchTerm = SearchText }); ), entonces 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 pusilánimes ... y este 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, puede extraerlos del Intención entrante: hay una cadena de Extras que contiene la solicitud (ver la deserialización en CreateViewModelFromIntent en https://github.com/slodge/MvvmCross/blob/master/Cirrious/Cirrious.MvvmCross/Android/Views/MvxAndroidViewsContainer.cs )

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<string,string> kvpAct1 = new KeyValuePair<string, string>("short", ".countertest5"); public IMvxCommand BeckhoffActuator1 { get { return new MvxRelayCommand<Type>((type) => this.RequestNavigate<Beckhoff.BeckhoffActuatorViewModel>(kvpAct1)); } }

Cuando se activa este IMvxCommand (botón presionado) se carga la siguiente Vista, en este caso BeckhoffActuatorViewModel. En el código de BeckhoffActuatorView utilizo el keyvaluepair de arriba:

public class BeckhoffActuatorView : MvxTouchDialogViewController<BeckhoffActuatorViewModel> { ICollection<string> 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 utilizar la misma construcción en mi aplicación de Android.

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

public class BeckhoffActuatorView : MvxBindingActivityView<BeckhoffSensorViewModel> { public ICollection<string> 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 completamente no se compilará / ejecutará.

¿Alguien sabe que puedo acceder al keyvaluepair que envío con RequestNavigate? ¡Gracias!