2011-11-04 6 views
7

मेरे पास एक प्रतिक्रियाशील यूआई-जैसा दृश्य मॉडल है। इसमें विभिन्न प्रकार के कई गुण हैं जो NotifyPropertyChanged घटनाओं को आग लगाते हैं और मैं किसी विधि को सब्सक्राइब करना चाहता हूं जिसे किसी को निकाल दिया जाने पर बुलाया जाएगा, लेकिन मुझे वास्तविक मूल्यों में रूचि नहीं है।रिटर्न प्रकार महत्वहीन होने पर अवलोकनों को मर्ज करने का एक और शानदार तरीका है?

मेरा वर्तमान कोड थोड़ा बदसूरत है (अपारदर्शी true चुनने के कारण)। क्या यह व्यक्त करने का कोई तरीका है जो घटना होने पर देखभाल करने का इरादा दिखाता है?

this.ObservableForProperty(m => m.PropertyOne) 
     .Select(_ => true) 
     .Merge(this.ObservableForProperty(m => m.PropertyTwo).Select(_ => true)) 
    .Subscribe(...) 

मैं लगभग 8 गुण विलय कर रहा हूं, इसलिए यह दिखाए जाने से अधिक बदसूरत है।

उत्तर

16

के बाद से इस ReactiveUI, की तरह लग रहा है कि कैसे WhenAny ऑपरेटर का उपयोग के बारे में:, आप अगर

this.WhenAny(x => x.PropertyOne, x => x.PropertyTwo, (p1, p2) => Unit.Default) 
    .Subscribe(x => /* ... */); 

सामान्य में हालांकि मनमानी पर्यवेक्षकों का संयोजन कर रहे थे, आप इसे गैर-विस्तार विधि का उपयोग करके थोड़ा और स्पष्ट रूप से भी लिख सकते हैं:

Observable.Merge(
    this.ObservableForProperty(x => x.PropertyOne).Select(_ => Unit.Default), 
    this.ObservableForProperty(x => x.PropertyTwo).Select(_ => Unit.Default), 
    this.ObservableForProperty(x => x.PropertyThree).Select(_ => Unit.Default) 
).Subscribe(x => /* ... */); 

इसके अलावा, आप एक ReactiveObject के हर संपत्ति सब्सक्राइब कर रहे हैं, यह शायद बेहतर बस का उपयोग करने के तरीके:

this.Changed.Subscribe(x => /* ... */); 
+0

वास्तव में प्रतिक्रियाशील नहीं है, अवलोकन योग्य प्रॉपर्टी केवल मेरी विस्तार विधि है जो संपत्ति का आकलन करती है और संपत्तिChanged eventpattern से देखने योग्य लौटती है। प्रत्येक संपत्ति की सदस्यता भी नहीं लेते, बस उनमें से कुछ। –

+0

जब कोई अच्छा लगता है, हालांकि जैसा कि मैं वाक्यविन्यास से समझता हूं, यह अभी भी वास्तविक मानों को अनदेखा नहीं करता है। –

+0

जब कोई ज़िप की तरह काम करता है, तो आप अंतिम पैरामीटर के रूप में चयनकर्ता फ़ंक्शन निर्दिष्ट करते हैं - इस मामले में, हम यूनिट का चयन कर रहे हैं –

2

आप इसे मंशा स्पष्ट करने के लिए एक विस्तार विधि बना सकता है:

public static IObservable<bool> IgnoreValue<T>(this IObservable<T> source) 
{ 
    return source.Select(_ => true); 
} 

... 

this.ObservableForProperty(m => m.PropertyOne).IgnoreValue() 
.Merge(this.ObservableForProperty(m => m.PropertyTwo).IgnoreValue()) 
.Subscribe(..); 
+0

हाँ कि कर सकता है। यदि कोई बेहतर विकल्प नहीं है तो शायद यह इस तरह से किया जाएगा, या इसके बजाय ObservableForPropertyIgnoreValue बनाओ। हालांकि इस मामले में हम मूल्य देखने योग्य बना रहे हैं जो हमारे इरादे को बहुत अच्छी तरह से उपयोग न करने के लिए संचार कर रहा है, जो मुझे लगता है कि बहुत सुंदर नहीं है। हालांकि हमें कुछ ऐसा लगता है जो मुझे लगता है तो कोई बेहतर तरीका नहीं होना चाहिए? –

+9

[यूनिट] (http://msdn.microsoft.com/en-us/library/system.reactive.unit (v = vs.103) .aspx) प्रकार, जो संवाद करेगा कि वापसी मूल्य का कोई मूल्य नहीं है इसके अलावा यह 'सत्य' के बजाय स्कॉट के सुझाव के लिए –

+0

+1 मौजूद है, 'यूनिट.डिफॉल्ट' –

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