在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接口支持最后一种风格。