c# - tutorial - mvvmcross xamarin forms
Al pasar el parĂ¡metro de Principal a Detalle en MVVMCross (2)
myItem es nulo porque si pasa el parámetro escrito a Init
, debería ser el único parámetro que pase. De acuerdo con la documentación de MvvmCross ViewModel Creation :
Init () puede venir en varios sabores:
- parámetros individuales de tipo simple
- un único objeto de parámetro escrito con propiedades simplemente tipadas
- como InitFromBundle () con un parámetro IMvxBundle: este último sabor siempre se admite a través de la interfaz IMvxViewModel.
Estoy tratando de pasar el elemento seleccionado de la lista a la vista de detalles, pero myitem
es nulo en el DetailViewmodel
aunque no se encuentre en MyViewModel
.
MyViewModel.cs
public virtual ICommand ItemSelected
{
get
{
return new MvxCommand<MyViewModel>(item =>{SelectedItem = item;});
}
}
public MyViewModel SelectedItem
{
get { return _selectedItem; }
set
{
_selectedItem = value;
// myItem is NOT null here!!!
ShowViewModel<MyDetailViewModel>(new { date = Date, myItem = _selectedItem });
RaisePropertyChanged(() => SelectedItem);
}
}
MyDetailViewModel.cs
public class MyDetailViewModel: MvxViewModel
{
private MyViewModel _myItem;
public void Init(DateTime date, MyViewModel myItem = null)
{
// myItem is NULL here!!!
_myItem = myItem;
}
}
Puede usar un objeto de parámetro, porque solo puede pasar un parámetro. Por lo general, marco un Parameter
clase anidado para esto.
public class MyDetailViewModel: MvxViewModel
{
private MyViewModel _myItem;
public class Parameter
{
public DateTime Date {get; set; }
public string Name {get; set;}
}
public void Init(Parameter param)
{
Name = param.Name;
}
}
y muestre el modelo de vista como:
ShowViewModel<MyDetailViewModel>(new MyDetailViewModel.Parameter { Date = Date, Name = _selectedItem.Name });
¡Pero ten cuidado!
Los parámetros no pueden ser complejos debido a ciertos problemas de la plataforma. Puede que tenga que pasar solo el Id
de su Elemento dentro del objeto Parameter
y luego cargar MyItem
en su función Init. O solo pasa una cadena y utiliza la serialización: https://.com/a/19059938/1489968