2009-01-29 19 views
7

में बाइंडिंग में अपडेट को कैसे स्थगित करना है, क्या नए संपत्ति मूल्य के साथ स्रोत अपडेट करने से पहले अंतिम परिवर्तन के बाद कुछ मिलीसेकंड प्रतीक्षा करने के लिए दो-तरफा WPF डेटा बाध्यकारी बताने का कोई आसान तरीका है?डब्ल्यूपीएफ

मैं एक सूची बॉक्स के लिए एक फ़िल्टर सुविधा लागू कर रहा हूं जहां मेरे पास एक टेक्स्टबॉक्स है, और मैं जो टाइप करता हूं उसके अनुसार मैं सूची बॉक्स की सामग्री को फ़िल्टर करना चाहता हूं। मैं एक साथ टुकड़ों को जोड़ने के लिए डेटा बाध्यकारी का उपयोग कर रहा हूँ। सूची को फ़िल्टर करना काफी समय ले सकता है, इसलिए मैं टाइप किए गए प्रत्येक चरित्र के बाद इसे नहीं करना चाहता: इसलिए मेरा अनुरोध।

मैं पॉल स्टोवेल के विलंब बाइंडिंग एक्सटेंशन का उपयोग कर रहा हूं (इस समय उसकी साइट नीचे है, इसलिए मैं इससे लिंक नहीं कर सकता)। हालांकि, मुझे संदेह है कि यह मेरे आवेदक में स्मृति रिसाव का कारण है (इसके कारण ईवेंट हैंडलर को नहीं हटाया जा रहा है)।

क्या किसी और के पास कोई अन्य विचार है?

+0

बस इस बात की पुष्टि, मैं DelayBinding के साथ इसी तरह समस्या पैदा हुई। मेरे पास एक एमवीवीएम खोल अनुप्रयोग था जिसमें मेनू बटन से भरा एक स्टैकपैनल और मुख्य सामग्री नियंत्रण था। ContentControl.Content शैल व्यू मॉडेल पर किसी प्रॉपर्टी द्वारा सेट किया गया था, हालांकि अगर मैंने UserControl लोड किया जिसमें डेले बाइंडिंग शामिल है, और फिर सामग्री को स्विच किया गया है, तो स्मृति उपयोग केवल छत के माध्यम से चला गया। मेमोरी प्रोफाइलर ने पुष्टि की कि पुरानी सामग्री उपयोगकर्ता नियंत्रण जीसी द्वारा एकत्रित होने से रोका गया था। – LiamV

उत्तर

2

सबसे पहले, अपने प्रश्न का उत्तर देने के लिए, मैं UpdateSourceTrigger बाइंडिंग एक्सटेंशन जोड़ दूंगा जो बाध्यकारी अपडेट के दौरान आपको नियंत्रित करने देगा। पहले लॉस्टफोकस आज़माएं लेकिन ऐसा लगता है कि आप स्पष्ट के लिए जाना चाहेंगे।

दूसरा, यदि आपकी फ़िल्टरिंग में काफी समय लगता है तो मैं आपके ListBox पर CollectionViewSource का उपयोग करने के लिए देखता हूं। बीए स्टॉलनिट्ज पर here पर एक अच्छा प्राइमर है और मैंने फ़िल्टर करने के तरीके को दिखाने के लिए this blog post का उपयोग किया। जब मैंने बदल दिया तो मैंने अपने अन्य कार्यान्वयन पर एक बड़ा गति अंतर देखा, भले ही वे एक ही फ़िल्टरिंग फ़ंक्शंस का उपयोग करते हों। यदि संग्रह एक ऑब्जेर्जेबल कोलेक्शन (यह मूल कारण है जिसे मैं CollectionViewSource में बदलता हूं) के लिए बाध्यकारी हो रहा है, तो सूची दृश्य दृश्य स्वचालित रूप से फ़िल्टर किए गए आइटम को अपडेट कर देगा यदि आप जिस सूची में बाध्य हैं, आइटम स्तर पर भी।

HTH

+0

धन्यवाद ब्रायन। मुझे UpdateSourceTrigger = स्पष्ट के बारे में पता था, लेकिन मुझे उम्मीद थी कि किसी के पास तैयार समाधान होगा (देरी बाइंडिंग के साथ) जो देरी के बाद अपडेट को ट्रिगर करने का ख्याल रखेगा। –

5

प्रश्न यहाँ (कुछ ही साल के लिए देर से एक छोटी सी :) लेकिन किसी को भी, जो मैं एक परियोजना में एक ऐसी ही आवश्यकता इसलिए मैं दो मार्कअप एक्सटेंशन DelayBindingExtension और DelayMultiBindingExtension बुलाया बनाया था रुचि है के लिए।

वे इसके अलावा कि आप UpdateSourceDelay और/या UpdateTargetDelay, जो दोनों के TimeSpan गुण हैं निर्दिष्ट कर सकते हैं के साथ सामान्य Bindings की तरह काम करते हैं। साथ ही, मैंने सत्यापित किया है कि यह लीक-मुक्त है (यह DependencyPropertyDescriptor) की बजाय विरासत संदर्भ के माध्यम से बाध्यकारी निर्भरता संपत्ति के प्रॉपर्टीस्ड कॉलबैक का उपयोग करता है। एक DelayBinding

<TextBox Text="{db:DelayBinding Path=TextProperty, 
           UpdateSourceTrigger=PropertyChanged, 
           UpdateSourceDelay='00:00:01'}"/> 

के लिए और DelayBinding और DelayMultiBinding के लिए एक DelayMultiBinding

<cs:ColorSelector.SelectedColor> 
    <db:DelayMultiBinding Mode="TwoWay" 
          Converter="{StaticResource ColorConverter}" 
          UpdateSourceDelay="00:00:02" 
          UpdateTargetDelay="00:00:01"> 
     <Binding Path="Red" /> 
     <Binding Path="Green" /> 
     <Binding Path="Blue" /> 
    </db:DelayMultiBinding> 
</cs:ColorSelector.SelectedColor> 

स्रोत कोड और नमूना उपयोग के लिए

उदाहरण उपयोग here डाउनलोड किया जा सकता।
आप कार्यान्वयन विवरण में रुचि रखते हैं, तो आप बाहर अपने ब्लॉग पोस्ट को इसके बारे में यहाँ देख सकते हैं: DelayBinding and DelayMultiBinding with Source and Target delay

+1

मुझे पता है कि यह एक पुराना उत्तर है, लेकिन यदि आप नेट फ्रेमवर्क 4.5 का उपयोग कर रहे हैं, तो [देरी संपत्ति] है (http://msdn.microsoft.com/en-us/library/system.windows। data.bindingbase.delay.aspx) –

+0

हर किसी के यहां देर से दिखता है, लेकिन इसके लिए धन्यवाद, इसका उपयोग सही है। मेरा सवाल है: यह काफी भारी दिखता है, क्या यह प्रदर्शन को बहुत अधिक प्रभावित नहीं करता है? – Kilazur

+1

@ किलाज़ुर: मैंने थोड़ी देर में इसके कार्यान्वयन को नहीं देखा है, लेकिन इसका प्रदर्शन पर उल्लेखनीय प्रभाव नहीं होना चाहिए। मैं इसे लगभग हर प्रोजेक्ट में उपयोग कर रहा हूं और मैंने कभी भी प्रदर्शन में कोई कमी नहीं देखी है :-) –

13

मैं भी कुछ साल देर हो रही है, लेकिन अगर आप इस के लिए WPF 4.5+ there is now an property उपयोग कर रहे हैं वास्तव में उद्देश्य, इसे Delay कहा जाता है।

विवरण

समय की राशि, मिलीसेकेंड में, बाध्यकारी स्रोत अद्यतन करने से पहले प्रतीक्षा करने के लिए।

उदाहरण उपयोग

<TextBlock Text="{Binding Name, Delay=500}"/>