コード例 #1
0
        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());
            });
        }