public OpenShiftMasterEndpointSettingsViewModel()
        {
            model   = OpenShiftMastersModel.Instance;
            Masters = model.Masters.ToReadOnlyReactiveCollection(m => new OpenShiftMasterViewModel(m));

            AddItemCommand = new ReactiveCommand()
                             .WithSubscribe(async() =>
            {
                var newMaster = new OpenShiftMasterModel();
                model.AddItem(newMaster);
                var added          = await Masters.ObserveAddChanged().FirstAsync();
                SelectedItem.Value = added;
            })
                             .AddTo(Disposable);

            RemoveItemCommand = SelectedItem
                                .Select(item => item != null)
                                .ToReactiveCommand()
                                .WithSubscribe(() => model.DeleteItem(SelectedItem.Value.Model))
                                .AddTo(Disposable);

            CanSave = Masters.Select(m => m.HasErrors).CombineLatestValuesAreAllFalse().ToReactiveProperty();

            IsSelected = SelectedItem
                         .Select(item => item != null)
                         .ToReadOnlyReactivePropertySlim(false);
        }
        public OpenShiftMasterViewModel(OpenShiftMasterModel model)
        {
            Model = model;
            Name  = Model
                    .Name
                    .ToReactivePropertyAsSynchronized(x => x.Value)
                    .SetValidateAttribute(() => Name)
                    .AddTo(Disposable);

            Endpoint = Model.MasterUrl
                       .ToReactivePropertyAsSynchronized(x => x.Value)
                       .SetValidateAttribute(() => Endpoint)
                       .AddTo(Disposable);

            Token = Model.Token
                    .ToReactivePropertyAsSynchronized(x => x.Value)
                    .SetValidateAttribute(() => Token)
                    .AddTo(Disposable);

            LoadFromLoginCommand = LoginCommand
                                   .Select(Parse)
                                   .Select(x => x.succeeded)
                                   .ToReactiveCommand(false)
                                   .WithSubscribe(() =>
            {
                var command = LoginCommand.Value;
                var(succeeded, url, token) = Parse(command);
                if (succeeded)
                {
                    Endpoint.Value = url;
                    Token.Value    = token;
                }
            }).AddTo(Disposable);
        }
        public OpenShiftMasterViewModel(OpenShiftMasterModel model)
        {
            Model = model;
            Name  = Model
                    .Name
                    .ToReactivePropertyAsSynchronized(x => x.Value)
                    .SetValidateAttribute(() => Name)
                    .AddTo(Disposable);

            Endpoint = Model.MasterUrl
                       .ToReactivePropertyAsSynchronized(x => x.Value)
                       .SetValidateAttribute(() => Endpoint)
                       .AddTo(Disposable);

            Token = Model.Token
                    .ToReactivePropertyAsSynchronized(x => x.Value)
                    .SetValidateAttribute(() => Token)
                    .AddTo(Disposable);
        }
 public OpenShiftExplorerMasterViewModel(OpenShiftMasterModel model)
 {
     this.model = model;
     Name       = model.Name.ToReadOnlyReactivePropertySlim();
     ChildItems = model.Projects.ToReadOnlyReactiveCollection(p => new OpenShiftExplorerProjectViewModel(p));
 }