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

时间:2016-04-19 21:36:20

标签: c# xamarin mvvmcross

我正在尝试将所选项目从列表传递到详细信息视图,但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;
    }
}

2 个答案:

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