Наблюдение за реактивным списком и свойством

У меня есть следующая ViewModel

class MyViewModel
{      
    private string _name;

    public MyViewModel()
    {
        CommitChanges = ReactiveCommand.Create(Observable.When(
            this.ObservableForProperty(x => x.Name)
            .And(Childs.CountChanged)
            .Then((one, two) => !string.IsNullOrWhiteSpace(one.Value) && two > 0)));
        CommitChanges.Subscribe(_ => DoCommitChanges());
    }

    public IReactiveList Childs { get ; } = new ReactiveList<object>();

    public string Name
    {
        get { return _name; }
        set { this.RaiseAndSetIfChanged(ref _naam, value); }
    }

    public ReactiveCommand<object> CommitChanges { get; }

    private void DoCommitChanges() { ... }
}

CanExecute команды CommitChanges неправильно отслеживает наблюдаемые. Например, когда я добавляю ребенка и задаю имя, CanExecute меняется на true, как и ожидалось, но когда я затем очищаю имя, CanExecute по-прежнему остается true. Что я делаю не так?


person Niek Jannink    schedule 03.01.2016    source источник


Ответы (1)


When / And / Then, насколько я понимаю, будет давать значение только тогда, когда обе последовательности генерируют значение. Таким образом, очистка Name не приведет к получению значения, пока не изменится Childs.Count.

Есть много способов приблизиться к этому. Я бы, наверное, сделал что-то вроде этого:

var nameHasValue = this.WhenAny(x => x.Name, x => !string.IsNullOrWhitespace(x.Value));

var isChildsEmpty = Childs.IsEmptyChanged.StartWith(Childs.IsEmpty);

var canCommit = nameHasValue
    .CombineLatest(isChildsEmpty, (hasName, isEmpty) => hasName && !isEmpty);

CommitChanges = ReactiveCommand.Create(canCommit);
person Charles Mager    schedule 03.01.2016