【问题标题】:Passing parameters from Detail to MainViewModel in MVVMCross在 MVVMCross 中将参数从 Detail 传递给 MainViewModel
【发布时间】:2016-04-20 00:01:53
【问题描述】:

我有两个视图:MainViewDetailView。我有一个要显示的项目列表,当用户选择一个项目并将项目属性传递给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 ;
    }
}

【问题讨论】:

    标签: c# xamarin mvvmcross


    【解决方案1】:

    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;
    }
    

    【讨论】:

    • 感谢您提供示例。我想知道您如何让每个项目 textview 更新,例如,categoryage 在这种方法中。
    • 您可以使用您在帖子中创建的Parameter 对象。我会进行编辑。
    • 我介绍问题的方式,您的基于消息的方法处理得很好。我忘了提到 detailViewModel 中有一个SAVE 按钮来保存用户条目以进行确认。在当前方法中,它会立即即时更新属性而无需确认。有没有办法处理这种情况?
    • 您可以使用MainViewModel 中的第二个对象将其保存为临时数据。当用户确认后,将数据从您的临时对象传输到您的主对象
    • 可以在你的例子中说明吗?
    【解决方案2】:

    为什么不在 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);
      }
    }
    

    【讨论】:

    • 能否举个简单的例子说明一下,好吗?
    • 我认为,这行不通,因为它正在被序列化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-12
    • 1970-01-01
    • 2020-04-13
    相关资源
    最近更新 更多