Как позволить 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);