【问题标题】:Passing Parameter From Main to Detail in MVVMCross在 MVVMCross 中将参数从 Main 传递到 Detail
【发布时间】:2016-04-19 21:36:20
【问题描述】:

我正在尝试将所选项目从列表传递到详细视图,但 myitemDetailViewmodel 中为空,即使它不在 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;
    }
}

【问题讨论】:

    标签: c# xamarin mvvmcross


    【解决方案1】:

    你可以使用参数对象,因为你只能传递一个参数。我通常为此创建一个嵌套类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 });
    

    但请注意!

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

    【讨论】:

    • 但是我还有另一个地方没有第二个参数要传递。我该如何处理?
    • 只是不要在调用ShowViewModel时在参数类中设置。例如,在您的 Init 函数中,您可以编写 if(param.Item != null)
    • 我仍然是空的! param.Item 为空。 Date 不为 null,但 Item 为 null。
    • 请参阅“注意”部分 :) 所以这取决于您的 Item 类,真正的解决方案会是什么样子。
    • MyItem 只是一个包含年龄、性别等的小对象。
    【解决方案2】:

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

    Init() 可以有多种形式:。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-27
      • 1970-01-01
      • 2014-06-28
      • 2012-03-03
      • 2013-09-12
      • 2019-07-27
      • 2017-02-20
      • 2017-01-03
      相关资源
      最近更新 更多