在MVVMCross中使用MessageProtocol更新ListItem

时间:2016-04-20 20:21:37

标签: c# android xamarin mvvmcross

我有一个列表项,其中包含大约10个对象。我能够检测到哪个项目被选中,并且我将此项目属性发送到DetailViewModel,我在mvvmcross中使用messageprotocol。

当用户在MainViewModel的edittext中输入新值时,我能够观察DetailViewModel中的更改。

我想知道如何将这些值放回到所选项目和更新列表中。

MainViewModel

private readonly IMvxMessenger _messenger;
private readonly MvxSubscriptionToken _token;

private MainViewModel _selectedItem;

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

public MainViewModel(IMvxMessenger messenger) {

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

private void OnMessageReceived(SelectedItemMessage obj)
{
  // I could observe the DetailView Changes in the MainViewModel
  // I wonder how to put these value back to selectedItem
    double? Age = obj.Age;
    int? Category= obj.Category;
}

public virtual ICommand ItemSelected
{
   get{ return new MvxCommand<TestViewModel>(item =>{ SelectedItem = item;});
   }
}

private ObservableCollection<TestViewModel> _testViews;
private ObservableCollection<WellTestViewModel> _allTestItemViews;

public void Init(string Id)
{
  List<Test> allTests = new List<Test>();
  allTests = _TestService.GetAllTestById(Id);

  foreach (var test in allTests)
  {
    _testViews.Add(TestViewModel.CreateViewModel(test, this));
  }

  _allTestItemViews = _testViews;
}

TestViewModel

    public static TestViewModel CreateViewModel(Test entity, MainViewModel parent = null)
    {
        if (entity == null)
        {
            return null;
        }
        return new TestViewModel(parent)
        {
            Age = entity.Age,
            Category= entity.Category,
       };
    }

    public TestViewModel()
    {
        // parameterless constructor
    }

    readonly MainViewViewModel _mainViewModel ;

    public TestViewModel(MainViewViewModel mainViewViewModel)
    {
        _mainViewModel = mainViewViewModel;
    }

DetailViewModel

private readonly IMvxMessenger _messenger;
public class Parameter
{
     public double? Age{ get; set; }
     public int? Category  { get; set; }
 }

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

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

public void UpdateMethod() {
    var message = new SelectedItemMessage(this,  age, category); 
    _messenger.Publish(message, typeof(SelectedItemMessage));
}

SelectedItemMessage

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

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

2 个答案:

答案 0 :(得分:4)

只需使用您的_selectedItem并在其上设置属性。

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

答案 1 :(得分:2)

您需要在OnMessageReceived方法中更新集合:

var item = _allTestItemViews.FirstOrDefault(i => i.Id == id);
if (item != null)
{
    item.Age = age;
    item.Category = category;
}

您需要将Id添加到模型类中,以便您可以唯一标识需要更新的项目。