2016-08-24 3 views
0

My DetailsViewModelは、選択したEnvelopeViewModelの変更を監視し、DetailsViewModelのAgendaItemIdを更新します。ReactiveUI - 単一の監視対象に対して複数のInvokeCommandが機能しない

MessageBus.Current.Listen(Of EnvelopeViewModel) _ 
     .Where(Function(x) x IsNot Nothing) _ 
     .Select(Function(x) x.AgendaItemID) _ 
     .ToPropertyEx(Me, Function(vm) vm.AgendaItemId) 

_agendaItemServiceから返されたAgendaItemを使用してDetailsViewModelを更新します。私はこれが問題を引き起こしていると信じている。

UpdateViewModel = ReactiveCommand.CreateAsyncTask(Function(x) _agendaItemService.FindAsync(AgendaItemId)) 
UpdateViewModel.SubscribeOn(RxApp.MainThreadScheduler).Subscribe(Sub(agendaItem) UpdateDetails(agendaItem)) 
UpdateViewModel.ThrownExceptions.Subscribe(Sub(ex) Log.ErrorException("LoadViewModel", ex)) 

WhenAnyValue(Function(vm) vm.AgendaItemId) _ 
    .Where(Function(agendaItemId) agendaItemId > 0) _ 
    .InvokeCommand(UpdateViewModel) 

Private Sub UpdateDetails(agendaItem As AgendaItem) 

    _agendaItem = agendaItem 

    PrimaryAgendaCategoryId = _agendaItem.AgendaCategory.ParentId 

    PrimaryAmount = agendaItem.Amounts.Where(Function(x) x.AmountType = AmountType.Primary).Sum(Function(x) x.Value) 
    SecondaryAmount = agendaItem.Amounts.Where(Function(x) x.AmountType = AmountType.Secondary).Sum(Function(x) x.Value) 
    LocalMatchAmount = agendaItem.Amounts.Where(Function(x) x.AmountType = AmountType.LocalMatch).Sum(Function(x) x.Value) 
    ChangeOrderTotalAmount = agendaItem.Amounts.Where(Function(x) x.AmountType = AmountType.ChangeOrder).Sum(Function(x) x.Value) 
    ProjectTotalAmount = agendaItem.Amounts.Sum(Function(x) x.Value) 

    Mapper.Map(_agendaItem, Me) 

    'TODO fix this attempt at getting save button to refresh when amounts are changed and saved. 
    Name = "" 
    Name = _agendaItem.Name 

End Sub 

これは実際に動作するようです。 DetailsViewは新しい値で更新されます。何が失敗するかは、私がDepartmentContactsを更新しようとするときです。

GetDepartmentContacts = ReactiveCommand.CreateAsyncTask(Function(x) _departmentService.GetDepartmentContactsAsync(AgendaItemId)) 
GetDepartmentContacts.ToPropertyEx(Me, Function(x) x.DepartmentContacts, New BindingList(Of PersonContactViewModel)) 
GetDepartmentContacts.ThrownExceptions.Subscribe(Sub(ex) Log.ErrorException("GetDepartmentContacts", ex)) 

WhenAnyValue(Function(vm) vm.AgendaItemId) _ 
     .Where(Function(id) id > 0) _ 
     .InvokeCommand(GetDepartmentContacts) 

ObservableAsPropertyHelper DepartmentContactはビューの更新に失敗しました。

しかし、私はUpdateViewModelコマンドの呼び出しをコメントアウトすると、DepartmentContactsは問題なく更新されます。

私のViewModelを更新するにはReactiveUIでもっと良い方法が必要です。

答えて

0

私は答えがCombining Commandsであると確信しています。

私は同じ観察可能性の上にInvokeCommandを2回使用できないと思います。 ReactiveCommand.CreateCombined私は2つのコマンドを1つのコマンドに組み合わせて呼び出すことができ、それに割り当てられた両方のコマンドを呼び出すことができます。

UpdateViewModel = ReactiveCommand.CreateAsyncTask(Function(x) _agendaItemService.FindAsync(AgendaItemId)) 
UpdateViewModel.SubscribeOn(RxApp.MainThreadScheduler).Subscribe(Sub(agendaItem) UpdateDetails(agendaItem)) 
UpdateViewModel.ThrownExceptions.Subscribe(Sub(ex) Log.ErrorException("LoadViewModel", ex)) 

GetDepartmentContacts = ReactiveCommand.CreateAsyncTask(Function(x) _departmentService.GetDepartmentContactsAsync(AgendaItemId)) 
GetDepartmentContacts.ToPropertyEx(Me, Function(x) x.DepartmentContacts, New BindingList(Of PersonContactViewModel)) 
GetDepartmentContacts.ThrownExceptions.Subscribe(Sub(ex) Log.ErrorException("GetDepartmentContacts", ex)) 

RefreshAgendaItemValues = ReactiveCommand.CreateCombined(RefreshViewModel, RefreshDepartmentContacts) 

WhenAnyValue(Function(vm) vm.AgendaItemId) _ 
    .Where(Function(id) id > 0) _ 
    .InvokeCommand(RefreshAgendaItemValues) 
関連する問題