C# 在MVVMCross中将参数从Main传递到Detail

C# 在MVVMCross中将参数从Main传递到Detail,c#,xamarin,mvvmcross,C#,Xamarin,Mvvmcross,我试图将所选项目从列表传递到详细视图,但是myitem在DetailViewmodel中为空,即使它不在MyViewModel中 MyViewModel.cs public virtual ICommand ItemSelected { get { return new MvxCommand<MyViewModel>(item =>{SelectedItem = item;}); }

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

myItem为null,因为如果将类型化参数传递给
Init
,则它应该是唯一传递的参数。根据:

Init()可以有几种风格:

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

myItem为null,因为如果将类型化参数传递给
Init
,则它应该是唯一传递的参数。根据:

Init()可以有几种风格:

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

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

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;
    }
}
并显示viewmodel,如下所示:

ShowViewModel<MyDetailViewModel>(new MyDetailViewModel.Parameter { Date = Date, Name = _selectedItem.Name });
ShowViewModel(新的MyDetailViewModel.Parameter{Date=Date,Name=\u selectedItem.Name});
但是要注意!
由于某些平台问题,参数不能太复杂。您可能只需要在
参数
对象中传递项目的
Id
,然后在Init函数中加载
MyItem
。或者只传递字符串并使用序列化:

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

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;
    }
}
并显示viewmodel,如下所示:

ShowViewModel<MyDetailViewModel>(new MyDetailViewModel.Parameter { Date = Date, Name = _selectedItem.Name });
ShowViewModel(新的MyDetailViewModel.Parameter{Date=Date,Name=\u selectedItem.Name});
但是要注意!
由于某些平台问题,参数不能太复杂。您可能只需要在
参数
对象中传递项目的
Id
,然后在Init函数中加载
MyItem
。或者只传递一个字符串并使用序列化:

,但我还有一个地方没有第二个要传递的参数。我应该如何处理它?只是在调用
ShowViewModel
时不要在参数类中设置它。例如,在
Init
函数中,您可以编写
if(param.Item!=null)
。我仍然得到null<代码>参数项
为空。日期不为空,但项为空。请参见“注意”部分:),这取决于您的项类实际解决方案的外观。
MyItem
只是一个包含年龄、性别等的小对象。但我还有一个地方没有第二个参数要传递。我应该如何处理它?只是在调用
ShowViewModel
时不要在参数类中设置它。例如,在
Init
函数中,您可以编写
if(param.Item!=null)
。我仍然得到null<代码>参数项
为空。日期不为空,但项为空。请参见“注意”部分:),因此它取决于您的项类实际解决方案的外观。
MyItem
只是一个包含年龄、性别等的小对象。