2016-04-20 2 views
0

У меня есть элемент списка, который имеет более или менее около 10 объектов. Я смог определить, какой элемент выбран, а также отправку свойств этого объекта в DetailViewModel. Я использую messageprotocol в mvvmcross.Обновить ListItem с MessageProtocol в MVVMCross

Я мог наблюдать изменения в 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; } 
} 
+0

Можете ли вы опубликовать код viewmodel, который имеет список? – Giorgi

+0

Я также добавил другой класс – hotspring

ответ

4

Просто используйте свой _selectedItem и установить свойства на нем.

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

Вам необходимо обновить коллекцию внутри метода OnMessageReceived:

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

Вам нужно добавить идентификатор вашего класса модели, так что вы можете однозначно идентифицировать объект, который нужно обновить.

Смежные вопросы