Search code examples
c#reactiveuidynamic-data

Reacting to ReactiveCommand in DynamicData collection


As I am trying to remove old implementations of ReactiveList, I find myself trying to implement a way to remove an item from a DynamicData collection when a ReactiveCommand in the said item is triggered.

The old implementation worked like this:

OldReactiveList
  .ObserveProperty(vm => vm.RemoveCommand)
  .Subscribe(vm => OldReactiveList.Remove(vm));

Is there a way to implement a similar structure with an observable change set from a DynamicData SourceList?
Everything I've tried so far seems to fail to either not knowing which item triggered the observation, or the observing relying on the observable property actually changing.


Solution

  • The cleanest solution I have come up with would be to modify the originally "empty" remove command to return "self":

    public class ListItemViewModel : ReactiveObject
    {
        public ReactiveCommand<Unit, ListItemViewModel> RemoveViewModel { get; }
    
        public ListItemViewModel()
        {
            RemoveViewModel = ReactiveCommand.Create(() => this);
        }
    }
    

    And then use SubscribeMany to listen to these commands and get the item to remove from the list:

    ViewModelList = ObservableCollectionExtended<ListItemViewModel>;
    ViewModelList.ToObservableChangeSet()
        .SubscribeMany(vm => vm.RemoveViewModel.Subscribe(x => ViewModelList.Remove(x)))
        .Subscribe();
    

    The ViewModelList could be implemented via SourceList or SourceCache, but the solution would be mostly the same. Only the way to access the change set would change.