将参数从 Detail 传递到 MVVMCross 中的 MainViewModel

Passing parameters from Detail to MainViewModel in MVVMCross

我有两种观点:MainViewDetailView。我有一个要显示的项目列表,当用户 select 一个项目时,我将项目属性传递给 DetailViewModel 并且用户可以更新这些值。

到目前为止一切正常,但我想知道如何将更新后的值传递回 MainViewModel

MainViewModel.cs

public MainViewModel SelectedItem
{
  get { return _selectedItem; }
  set
  {
    _selectedItem = value;
    ShowViewModel<DetailViewModel>(
    new DetailViewModel.Parameter
    {
        Date = Date,
        Age = _selectedItem.Age,
        Category = _selectedItem.Category,
        Discount = _selectedItem.Discount,
      }
     );

    RaisePropertyChanged(() => SelectedItem);
  }
}

DetailViewModel.cs

public class DetailViewModel: MvxViewModel
{
    public double Age { get; set; }
    public double Category { get; set; }
    public double Discount { get; set; }

    public class Parameter
    {
        public DateTime Date { get; set; }
        public double Age { get; set; }
        public int Category{ get; set; }
        public double Discount { get; set; }
    }

    public void Init(Parameter param)
    {
        Age = param.Age;
        Category = param.Category;
        Discount = param.Discount ;
    }
}

为什么在 MainViewModel 中创建 DetailViewModel 时不只保留对它的引用?然后,在 DetailViewModel 实例中更改的任何值都将通过 MainViewModel 中的该引用可用。

private DetailViewModel _detailVM;

public MainViewModel SelectedItem
{
  get { return _selectedItem; }
  set
  {
    _selectedItem = value;
    _detailVM = new DetailViewModel.Parameter {
        Date = Date,
        Age = _selectedItem.Age,
        Category = _selectedItem.Category,
        Discount = _selectedItem.Discount
    };

    ShowViewModel<DetailViewModel>(_detailVM);

    RaisePropertyChanged(() => SelectedItem);
  }
}

ViewModels 之间传递变量的一种方法是基于 Messenger 的解决方案。

MvvmCross Messenger 可以在 NuGet 中找到。

MainViewModel

private readonly IMvxMessenger _messenger;
private readonly MvxSubscriptionToken _token;

public MainViewModel(IMvxMessenger messenger) {

    _messenger = messenger;
    _token = messenger.Subscribe<SelectedItemMessage>(OnMessageReceived);;
}

private void OnMessageReceived(SelectedItemMessage obj)
{
    SelectedItem = obj.SelectedItem;
}

DetailViewModel

private readonly IMvxMessenger _messenger;

public DetailViewModel(IMvxMessenger messenger) {
    _messenger = messenger;
}

public void YourUpdateMethod() {
    var message = new SelectedItemMessage(this, SelectedItem); //SelectedItem assumed it is a ViewModel property.
    _messenger.Publish(message, typeof(SelectedItemMessage));
}

SelectedItemMessage

public class SelectedItemMessage : MvxMessage
{
    public SelectedItemMessage(object sender, SelectedItem selectedItem) : base(sender)
    {
        SelectedItem = selectedItem;
    }

    public SelectedItem SelectedItem { get; set; }
}

查看 http://slodge.blogspot.nl/2013/05/n9-getting-message-n1-days-of-mvvmcross.html 以获得 MvvmCross Messenges 的完整指南。

在消息中使用年龄和类别编辑

public SelectedItemMessage(object sender, double age, int category) : base(sender)
    {
        Age = age;
        Category = category;
    }

    public double Age { get; set; }
    public int Category{ get; set; }
}

更改 MainViewModel OnMessageReceived 方法

private void OnMessageReceived(SelectedItemMessage obj)
{
    Age = obj.Age;
    Category= obj.Category;
}