2014-04-27 8 views
5

मेरे पास मेरे व्यूमोडेल में कई आदेश हैं और मैं प्रत्येक बटन का CanExecute एक अवलोकन करने योग्य व्यस्त के लिए बाध्य होना चाहता हूं जिसे परिभाषित किया गया है क्योंकि वर्तमान में कोई भी बटन निष्पादित नहीं हो रहा है।कैसे प्रतिक्रियाशील समुदाय अपने स्वयं के 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 परिभाषित करने की जरूरत।

इस चिकन और अंडे की समस्या को हल करने के तरीके पर कोई विचार? एक ViewModel (या 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

बढ़िया है, अच्छी तरह से काम करता है। इसके बारे में कभी सोचा नहीं, मैं सिर्फ 'विषय खराब हैं' मंत्र को दोष दूंगा जो मंत्र के आसपास जा रहा है :-)। साथ ही, अंतिम पंक्ति में विषय शामिल करने के लिए 'सदस्यता लें (n => areAllAvailable.OnNext (n)) 'शामिल होना चाहिए। – Wouter

+0

विषय अनिवार्य रूप से 'खराब' नहीं हैं, वे बहुत ही कार्यात्मक नहीं हैं। वे मौजूदा कोड को आरएक्स को अनुकूलित करने के लिए वास्तव में वास्तव में अच्छे हैं, क्योंकि यह कोड कार्यात्मक नहीं हो सकता है! –

संबंधित मुद्दे