2014-04-27 100 views
5

我的ViewModel中有幾個命令,我希望每個按鈕的CanExecute都綁定到一個可觀察的忙,它被定義爲當前沒有任何按鈕正在執行。如何讓ReactiveCommands觀察他們自己的IsExecuting可觀察的

以下是我想到的,但顯然它會運行到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)); 

同樣在ReactiveCommand的CanExecuteObservable屬性是隻讀的,所以我必須先初始化命令定義的IObservable。

關於如何解決雞和雞蛋問題的任何想法?觀察忙碌狀態的視圖模型(或的ViewModels的集合)的一種更好的方式將還讚賞:-)

回答

8

我將通過使用主題設置代理:

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); 
+0

大,很好地工作。從來沒有想到這一點,我只會責怪'科目是壞' - 曼陀羅正在傳播:-)。另外,最後一行應該包含'.Subscribe(n => areAllAvailable.OnNext(n))'來更新主題。 – Wouter

+0

受試者不一定是'壞',他們只是功能不夠。它們實際上對於將現有代碼適配到Rx非常有用,因爲該代碼可能不是功能性的! –

相關問題