在MVVMCross中将参数从Main传递给Detail

我试图将所选项目从列表传递到详细信息视图,但是在DetailViewmodel myitem为null,即使它不在MyViewModel

MyViewModel.cs

  public virtual ICommand ItemSelected { get { return new MvxCommand(item =>{SelectedItem = item;}); } } public MyViewModel SelectedItem { get { return _selectedItem; } set { _selectedItem = value; // myItem is NOT null here!!! ShowViewModel(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; } } 

您可以使用参数对象,因为您只能传递一个参数。 我通常为此创建一个嵌套类Parameter

 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; } } 

并显示视图模型:

 ShowViewModel(new MyDetailViewModel.Parameter { Date = Date, Name = _selectedItem.Name }); 

但要注意!

由于某些平台问题,参数不能很复杂。 您可能必须在Parameter对象中仅传递Item的Id ,然后在Init函数中加载MyItem 。 或者您只传递一个字符串并使用序列化: https : //stackoverflow.com/a/19059938/1489968

myItem为null,因为如果将类型参数传递给Init它应该是您传递的唯一参数。 根据MvvmCross ViewModel Creation文档 :

Init()可以有几种forms:

  • 个别简单类型参数
  • 单个Typed参数对象,具有简单类型属性
  • 作为具有IMvxBundle参数的InitFromBundle() – 始终通过IMvxViewModel接口支持最后一种风格。