2015-09-04 25 views
6

पर नमूदार पैटर्न मैं अगर मैं इनपुट बॉक्स में searc दर्ज प्रतिक्रियाशील एक्सटेंशनप्रतिक्रियाशील विस्तार

IObservable<string> textChangedObservable = 
      Observable.FromEventPattern<TextChangedEventArgs>(searchScrip, "TextChanged") 
       .Select(evt => ((TextBox) sender).Text); 

textChangedObservable.Subscribe(OnNext, OnCompleted); 

private void OnNext(string s) 
    { 
     System.Diagnostics.Debug.Print("OnNext " + s + "\n"); 
    } 

    private void OnCompleted() 
    { 
     System.Diagnostics.Debug.Print("OnCompleted " + "\n"); 
    } 

का उपयोग करने की कोशिश कर नीचे कोड को समझने के लिए कोशिश कर रहा हूँ, उत्पादन लग रहा है

  • OnNext एसई
  • OnNext समुद्र
  • OnNext समुद्र
  • OnNext शुष्क
  • OnNext शुष्क
  • OnNext शुष्क
  • OnNext searc
  • OnNext searc
  • OnNext searc
  • OnNext searc

    1. क्यों "एस" एक OnNext ट्रिगर नहीं कर रहा?
    2. ऑन कॉम्प्लेटेड क्यों नहीं कहा जाता है?
    3. ऑननेक्स्ट ने एनएच चरित्र पर एन -1 समय क्यों कहा है?
+0

नहीं वर्ग के बाद से एक आसान सवाल 'XamTextEditor' सहजता से उपलब्ध नहीं है। मुझे संदेह है कि इसके पास 'रूटेडप्रॉपर्टी चेंज' – supertopi

+0

के कार्यान्वयन के साथ कुछ करने का असर हो सकता है, असल में, आपको हमें यह बताना होगा कि XAML तत्व 'searchScrip' और 'प्रेषक' क्या हैं। – supertopi

+0

चीजों को सरल रखने के लिए wpf टेक्स्ट बॉक्स का उपयोग करने के लिए कोड नमूना बदल दिया। लेकिन व्यवहार अभी भी – asb

उत्तर

3

ऐसा प्रतीत होता है कि आप अपने searchScrip_TextChanged हैंडलर में देखने योग्य की सदस्यता ले रहे हैं।

इसका मतलब यह है कि पहली बार है कि searchScrip_TextChanged कहा जाता हो जाता है S पहले से ही इससे पहले कि आप नमूदार ऊपर तार कर दिया है हुआ है। तो निश्चित रूप से यह आग नहीं है।

लेकिन अब S मारा गया है आपके पास एक सदस्यता है इसलिए E टाइप किया गया है तो आपको एक SE मिलता है। लेकिन चूंकि searchScrip_TextChanged हैंडलर को E के लिए बुलाया जाता है, इसलिए अब आपके पास देखने योग्य के लिए दो सदस्यताएं हैं।

तो जब A टाइप किया गया है तो आपको दो SEA मिलेंगे क्योंकि आपके पास दो अवलोकन हैं। लेकिन फिर searchScrip_TextChanged को A के लिए बुलाया गया है, इसलिए अब आपके पास तीन अवलोकन हैं।

आदि, आदि,

घटनाक्रम स्वचालित रूप से पूर्ण नहीं होते हैं। आपको उन्हें समाप्त करने के लिए सब्सक्रिप्शन का मैन्युअल रूप से निपटान करने की आवश्यकता है। यह समझ में आना चाहिए क्योंकि आपको सामान्य ईवेंट हैंडलर के साथ ऐसा करना है जिसे आप रोकना चाहते हैं।

जब आपका फॉर्म लोड हो जाता है तो आपको अपना अवलोकन योग्य बनाना चाहिए ताकि इसे एक बार बनाया जा सके।

यह इस तरह दिखना चाहिए:

IObservable<string> textChangedObservable = 
     Observable.FromEventPattern<TextChangedEventArgs>(searchScrip, "TextChanged") 
      .Select(evt => searchScrip.Text); 

IDisposable subscription = 
    textChangedObservable 
     .Subscribe(
      s => Debug.Print("OnNext " + s + "\n"), 
      s => Debug.Print("OnCompleted\n")); 
-1

हो सकता है कि क्योंकि आप RoutedPropertyChangedEventArgs इस्तेमाल किया है?

यदि आप PropertyChangedEventHandler का उपयोग करते हैं तो क्या होगा?

Observable.FromEventPattern<PropertyChangedEventHandler, PropertyChangedEventArgs>(
       h => yourModel.propertyChanged += h, 
       h => yourModel.propertyChanged -= h) 
      .Where(x => x.EventArgs.PropertyName = "your_property_name"); 
    } 
2

यहां समस्या वास्तव में आरएक्स के साथ कुछ लेना देना नहीं है।

1: "एस" क्यों एक ऑननेक्स्ट ट्रिगर नहीं कर रहा है?

क्योंकि TextChanged घटना आप की सदस्यता ली है पहले एस

2 पर गोली नहीं था: क्यों कहा जाता है कभी नहीं OnCompleted है?

जब आप एक IObservable<T> के रूप में एक नेट घटना लपेट, आप कभी नहीं OnError या OnCompleted सूचनाएं प्राप्त करें। .NET ईवेंट के साथ त्रुटि या पूर्णता की कोई अवधारणा नहीं है।

अगर वहाँ दो घटनाओं, मूल्यों के लिए और एक पूरा करने के लिए कर रहे हैं, तो आप उन्हें तो जैसे गठजोड़ कर सकते हैं:

var values = Observable.FromEvent(...); 
var completion = Observable.FromEvent(...); 
var query = values.TakeUntil(completion); 

अब query एक उचित OnCompleted अधिसूचना निकलेगा।

3: ऑननेक्स्ट ने एनएच चरित्र पर एन -1 समय क्यों कहा?

क्योंकि TextChanged ईवेंट आपने इस तरह से निकालने के लिए सदस्यता ली है।जैसा कि @ कारी-एंटी द्वारा इंगित किया गया था, यह "रूटेड संपत्ति" घटना का उपयोग करने का दुष्प्रभाव हो सकता है।

+0

के प्रश्नों जैसा ही है 1. खोजस्क्रिप्ट के लिए मेरा एक्सएएमएल और जब मैं ब्रेक पॉइंट डालता हूं, तो यह "एस" के लिए ट्रिगर होता है "कार्यान्वयन पर" निजी शून्य खोज Scrip_TextChanged (ऑब्जेक्ट प्रेषक, RoutedPropertyChangedEventArgs ई) " – asb

+0

@asb मुझे नहीं पता कि मैंने पहले जो कहा है उससे परे आपकी सहायता कैसे करें। पर्यवेक्षण अंतर्निहित घटना से अलग नहीं होगा। यह एक बहुत ही सरल तंत्र है। तो आप क्या कह रहे हैं, कि देखने योग्य और घटना एक ही काम नहीं कर रही है, जो कि मैं सच होने के बारे में जानता हूं। –

+0

@ टिमोथी शील्ड्स - उन्होंने बार-बार पर्यवेक्षण की सदस्यता ले ली है - यही कारण है कि 'ऑननेक्स्ट' को 'n - 1' बार कहा जा रहा है। – Enigmativity

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