2014-04-27 22 views
5

Tôi có một vài lệnh trong ViewModel và tôi muốn có CanExecute của mỗi nút được liên kết với một bận rộn quan sát được định nghĩa là không có nút nào đang thực hiện.Làm thế nào để cho ReactiveCommands quan sát IsExecuting của riêng mình có thể quan sát được

Sau đây là những gì tôi đã đưa ra, nhưng rõ ràng nó chạy vào một 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)); 

Ngoài ra thuộc tính CanExecuteObservable trên ReactiveCommand là chỉ đọc, vì vậy tôi cần xác định IObservable trước khi tôi khởi tạo lệnh.

Bất kỳ ý tưởng nào về cách giải quyết vấn đề về trứng gà này? Một cách tốt hơn để quan sát trạng thái bận rộn cho một ViewModel (hoặc một tập hợp các ViewModels) sẽ được đánh giá cũng :-)

Trả lời

8

tôi sẽ thiết lập một proxy thông qua sử dụng một Subject:

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

Tuyệt vời, hoạt động độc đáo. Không bao giờ nghĩ về điều đó, tôi sẽ chỉ đổ lỗi cho các 'đối tượng là xấu'-thần chú đó là đi xung quanh :-). Ngoài ra, dòng cuối cùng nên bao gồm '.Subscribe (n => areAllAvailable.OnNext (n))' để cập nhật chủ đề. – Wouter

+0

Đối tượng không nhất thiết phải là 'xấu', chúng không thực sự có chức năng. Chúng thực sự thực sự tốt cho việc thích ứng với mã hiện tại thành Rx, vì mã đó có thể không có chức năng! –

Các vấn đề liên quan