public IssueAssigneeViewModel( Func <Task <IReadOnlyList <User> > > loadAssignees, Func <Task <User> > loadCurrentlyAssigned, Func <User, Task> updateIssue ) { DismissCommand = ReactiveCommand.Create(); var derivedFunc = new Func <User, IssueAssigneeItemViewModel>(x => { var vm = new IssueAssigneeItemViewModel(x); if (_selectedUser != null) { vm.IsSelected = x.Id == _selectedUser.Id; } vm.GoToCommand .Select(_ => vm.IsSelected ? x : null) .Subscribe(user => { foreach (var a in Assignees.Where(y => y != vm)) { a.IsSelected = false; } updateIssue(user).ToBackground(); DismissCommand.ExecuteIfCan(); }); return(vm); }); var assignees = new ReactiveList <User>(); Assignees = assignees.CreateDerivedCollection( derivedFunc, filter: x => x.Name.ContainsKeyword(SearchKeyword), signalReset: this.WhenAnyValue(x => x.SearchKeyword)); LoadCommand = ReactiveCommand.CreateAsyncTask(async _ => { _selectedUser = (await loadCurrentlyAssigned()); assignees.Reset(await loadAssignees()); }); }