Как позволить ReactiveCommands наблюдать их собственный IsExecuting наблюдаемый

У меня есть несколько команд в моей ViewModel, и я хочу, чтобы CanExecute каждой кнопки был привязан к наблюдаемому занятию, которое определено, поскольку ни одна из кнопок в данный момент не выполняется.

Вот то, что я придумал, но, очевидно, это приводит к исключению NullReferenceException.

busy = Observable.CombineLatest(this.PlayCommand.IsExecuting, this.PauseCommand.IsExecuting, (play, pause) => play && pause);

this.PauseCommand = new ReactiveCommand(busy.Select(b => !b));
this.PlayCommand = new ReactiveCommand(busy.Select(b=> !b));

Также свойство CanExecuteObservable в ReactiveCommand доступно только для чтения, поэтому мне нужно определить IObservable, прежде чем я инициализирую команды.

Любые идеи о том, как решить эту проблему курицы и яйца? Также был бы признателен лучший способ наблюдения за состоянием занятости для ViewModel (или коллекции ViewModel):-)

1 ответ

Решение

Я бы настроил прокси с помощью темы:

var areAllAvailable = new BehaviorSubject<bool>(true);

PauseCommand = new ReactiveCommand(areAllAvailable);
PlayCommand = new ReactiveCommand(areAllAvailable);

Observable.CombineLatest(PauseCommand.IsExecuting, PlayCommand.IsExecuting, 
    (pa,pl) => !(pa || pl))
    .Subscribe(allAreAvailable);
Другие вопросы по тегам