2011-03-17 15 views
24

के पाठ बॉक्स बाइंडिंग मैं एक पाठ बॉक्स है कि मेरे ViewModel पर एक संपत्ति DatabaseFilterWPF ViewModel

यहाँ कहा जाता है करने के लिए बाध्य कर रहा है संपत्ति

public string DatabaseFilter { 
    get { return _databaseFilter; } 
    set { 
     _databaseFilter = value; 
     FilterDatabases(); 
    } 
} 

के रूप में आप देख सकते हैं, मैं कोशिश कर रहा हूँ के कार्यान्वयन है टेक्स्टबॉक्स में टाइप की गई चीज़ों के आधार पर एक फ़िल्टरिंग ट्रिगर करें।

समस्या यह है कि जब टेक्स्टबॉक्स फोकस खो देता है तो सेटटर ट्रिगर होता है। इसलिए टेक्स्टबॉक्स में टाइप करना कुछ भी नहीं कर रहा है, जब तक कि उपयोगकर्ता टैब दबाए।

क्या बाध्यकारी अद्यतन बाध्यकारी के माध्यम से प्रत्येक कुंजी प्रेस के साथ व्यूमोडेल को अंडरलिंग करना संभव है? UI/codebehind जितना संभव हो उतना साफ रखने के लिए, मैं कुंजी डाउन/अप ईवेंट जोड़ने से बचना चाहता हूं।

उत्तर

41

अपने पाठ बॉक्स पर UpdateSourceTrigger सेट PropertyChanged (जो LostFocus करने के लिए डिफ़ॉल्ट)

+0

वह था, धन्यवाद! –

+0

मदद करने के लिए खुश :) – Maverik

+1

सभी लोगों के लिए एक पूरी तरह से वैध उत्तर कम करने के लिए: कम से कम एक टिप्पणी को पेस्ट करने का निर्णय लें कि आप क्या बेहतर दिखेंगे, अगर आप इसे स्वयं नहीं कर सकते हैं – Maverik

0

अपने वीएम "फ़िल्टरडेटाबेस कमांड" में एक कमांड बनाएं, इस आदेश में टेक्स्टबॉक्स के "टेक्स्ट चेंज" ईवेंट को बाध्य करें (EventToCommand व्यवहार का उपयोग करें)।

या बस यह करने के लिए अपने कोड बदलने के लिए:

public string DatabaseFilter { 
    get { return _databaseFilter; } 
    set { 
     if(_databaseFilter != value) { 
      _databaseFilter = value; 
      FilterDatabases(); 
     } 
    } 
} 
+0

सुनिश्चित नहीं है कि आपका कोड नमूना उसकी समस्या का समाधान कैसे करता है। – Mikeb

+0

धन्यवाद, हालांकि संपत्ति कोड बदलना ज्यादा नहीं होगा क्योंकि इसे खोए गए फोकस तक नहीं बुलाया जा रहा है। कमांड बनाना काम करेगा, लेकिन मेरे मामले में, मैं सरल समाधान पसंद करता हूं जिसके लिए कमांड की आवश्यकता नहीं होती है, बस सरल बाध्यकारी। UpdateSourceTrigger प्रॉपर्टी को बदलने के उपरोक्त सुझाव के साथ चला गया और मैंने जो किया वह किया। –

3

UpdateSourceTrigger=PropertyChanged के लिए आप

+0

जो था, धन्यवाद ! –

5

इस समस्या को हल करना चाहिए अपने बंधन को बदलें जब भी संपत्ति बदलती है तो स्रोत को अपडेट करने के लिए:

<TextBox Text="{Binding DatabaseFilter, UpdateSourceTrigger=PropertyChanged}">

3

अपने बाध्यकारी पर Binding.UpdateSourceTrigger संपत्ति का उपयोग करें। डिफ़ॉल्ट अद्यतन स्रोत ट्रिगर फोकस नुकसान है। आप इसे बदल सकते हैं ताकि जब भी टेक्स्टबॉक्स में टेक्स्ट बाध्यकारी हो जाए तो बदल जाएगा।

देख http://msdn.microsoft.com/en-us/library/system.windows.data.binding.updatesourcetrigger.aspx

22

आप अपने बाध्यकारी अभिव्यक्ति, उदा UpdateSourceTrigger=PropertyChanged गुण सेट करने की जरूरत है

<TextBox Text="{Binding Path=DatabaseFilter, UpdateSourceTrigger=PropertyChanged}" /> 

वहाँ भी विभिन्न मूल्यों उपलब्ध हैं, जैसे: Explicit - जब आप स्पष्ट रूप से बाध्यकारी पर अद्यतन कॉल करने के लिए की जरूरत है; LostFocus - यह TextBox के लिए डिफ़ॉल्ट है, नियंत्रण के बाद बाध्यकारी अद्यतन फोकस खो देता है।

आपको याद रखना होगा कि यदि आपकी फ़िल्टरिंग कार्रवाई यूआई थ्रेड पर निष्पादित की जाती है, तो प्रत्येक कीस्ट्रोक के बाद फ़िल्टर करना सबसे बुद्धिमान काम नहीं हो सकता है, क्योंकि उपयोगकर्ता अनुभव इस फ़िल्टरिंग द्वारा बनाई गई देरी से गंभीर रूप से प्रभावित हो सकता है। यदि आप सकारात्मक हैं, तो आपको प्रत्येक कीस्ट्रोक के बाद फ़िल्टर करने की आवश्यकता है, सुनिश्चित करें कि फ़िल्टरिंग त्वरित हो जाएगी (उदा। फ़िल्टर करने के लिए केवल कुछ आइटम हैं), या आप पृष्ठभूमि थ्रेड में फ़िल्टर करेंगे।

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