我正在尝试将所选项目从列表传递到详细信息视图,但myitem
中的DetailViewmodel
为空,即使它不在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;
}
}
答案 0 :(得分:5)
您可以使用参数对象,因为您只能传递一个参数。我通常会为此创建一个嵌套类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<MyDetailViewModel>(new MyDetailViewModel.Parameter { Date = Date, Name = _selectedItem.Name });
由于某些平台问题,参数不能很复杂。您可能只需要在Id
对象中传递项目的Parameter
,然后在Init函数中加载MyItem
。或者您只传递一个字符串并使用序列化:https://stackoverflow.com/a/19059938/1489968
答案 1 :(得分:2)
myItem为null,因为如果将类型参数传递给Init
,它应该是您传递的唯一参数。根据{{3}}:
Init()可以有多种形式:。
- 个人简单类型参数
- 具有简单类型属性的单个Typed参数对象
- 作为具有IMvxBundle参数的InitFromBundle() - 始终通过IMvxViewModel接口支持最后一种风格。