2010-02-01 6 views
11

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

मैं इसमें वस्तुओं के एक समूह के साथ एक ListView है। उपयोगकर्ता एक नया आइटम चयन करता है, आवेदन पत्र में एक TextBox चयनित आइटम में से कुछ संपत्ति प्रदर्शित करने के लिए अपने पाठ बदल जाएगा।

लेकिन मैं ListView आइटम को तुरंत भी अपडेट हो करना चाहते हैं जब उपयोगकर्ता पाठ बॉक्स में पाठ बदल जाता है। क्या यह पूरा करने का कोई "दो-तरफा बाध्यकारी" जादुई WPF तरीका है?

उत्तर

11

मदद कर सकता है आप अपने वर्ग है कि आप के लिए बाध्य कर रहे हैं के लिए INotifyPropertyChanged लागू करने के लिए की आवश्यकता होगी नहीं किया है।

इसके अलावा, जब आप कहते हैं कि आप ListBox आइटम को तत्काल अपडेट करना चाहते हैं, तो आप का मतलब है कि आप TextBox में टाइप करते समय इसे बदलना चाहते हैं। डिफ़ॉल्ट रूप से TextBox.Text संपत्ति उसके स्रोत अद्यतन करता है जब यह ध्यान केंद्रित खो देता है, लेकिन आप की स्थापना करके इसे बदल सकते हैं बाध्यकारी UpdateSourceTriggerPropertyChanged रहे हैं:

{Binding Source={...}, Path=Whatever, UpdateSourceTrigger=PropertyChanged} 
+3

कैसे वह चीजों की स्थापना की है के आधार पर, कि स्रोत यदि बाध्य वस्तुओं के सेट DataContext है, छोड़ा जा सकता है ElementName में परिवर्तित करने (SelectedItem.Whatever की एक पथ के साथ) की आवश्यकता हो सकती है, या, है, लेकिन बाद के मामले में ListView को IsSynchronizedWithCurrentItem = "True" की आवश्यकता होगी। – itowlson

+0

यह इटॉल्सन कहते हैं। आपका बहुत बहुत धन्यवाद! –

+0

अहह सच, और वाक्यविन्यास को ठीक करने के लिए धन्यवाद;) –

1

ListView में आइटम का प्रकार क्या है? दो तरह से INotifyPropertyChanged लागू करना होगा जा रहा बंधन पाने के लिए ...

यह WPF event property changed?

+0

सूची दृश्य में आइटम ऑब्जेक्ट लागू करते हैं 'INotifyPropertyChanged' हैं। –

+0

क्या आपके पास कोई नमूना है कि आपका कोड कैसा दिखता है? – anthonyv

33

Mark's answer से पता चलता पूरा करने के लिए कैसे आप क्या चाहते हैं, लेकिन आप भी अधिक आम तौर पर के बारे में पूछा " कैसे [दो तरफा बाध्यकारी] को पूरा करने के लिए और वास्तव में इसका क्या अर्थ है। "

एक तरफा बाध्यकारी का अर्थ है कि बाध्यकारी लक्ष्य (जैसे नियंत्रण) बाध्यकारी स्रोत (जैसे व्यवसाय ऑब्जेक्ट) से डेटा प्रदर्शित करेगा, और खुद को व्यापार ऑब्जेक्ट में परिवर्तन के रूप में अपडेट करेगा, लेकिन नियंत्रण में परिवर्तनों को प्रचारित नहीं किया जाएगा व्यापार वस्तु पर वापस। जैसे अगर व्यक्ति "बॉब" से "केट" में बदल जाता है, तो टेक्स्टब्लॉक। नाम से जुड़ा अगला "बॉब" से "केट" में भी बदल जाएगा।

दो-तरफा बंधन का अर्थ है कि न केवल व्यापार वस्तु में परिवर्तन यूआई में परिलक्षित होते हैं, लेकिन यूआई में उपयोगकर्ता द्वारा किए गए परिवर्तनों भी वापस व्यापार वस्तु के लिए उगाया जाता है। तो अब उपयोगकर्ता TextBox.Text नाम करने के लिए बाध्य संपादित करता है तो बदल रहा है "केट" से "एडमंड" कहते हैं, WPF Person.Name संपत्ति को "एडमंड" के रूप में अच्छी तरह से सेट हो जाएगा।

इसे पूरा करने के लिए, बस बाध्यकारी घोषणा पर मोड = TwoWay निर्धारित किया है। कुछ गुण डिफ़ॉल्ट रूप से दो-तरफा बांधते हैं: टेक्स्टबॉक्स। टेक्स्ट, उदाहरण के लिए, डिफ़ॉल्ट रूप से टूवे को बांधता है, यही कारण है कि मार्क के कोड को मोड घोषणा की आवश्यकता नहीं है। इसके अलावा, मार्क नोट्स के रूप में, डिफ़ॉल्ट रूप से डब्लूपीएफ केवल व्यापार ऑब्जेक्ट में परिवर्तन को प्रसारित करता है जब नियंत्रण फोकस खो देता है। आप एक ही संपत्ति के लिए बाध्य दो UI तत्व है, तो इसका मतलब यह कर सकते हैं वे सिंक्रनाइज़ेशन से बाहर दिखाई देते हैं, जिस स्थिति में आप जब भी प्रचार करने के लिए गुण परिवर्तन WPF के लिए मजबूर करने UpdateSourceTrigger उपयोग कर सकते हैं।

MSDN कुछ अच्छी स्पष्ट चित्र के साथ विस्तार से इस कवर करता है: WPF SDK में Data Binding Overview देखते हैं।

+1

बाइंडिंग का अच्छा अवलोकन। =) –

+0

वोट दिया गया। खोज परिणामों के एक टन के माध्यम से चला गया कि सभी ने वर्णन किया कि दो-तरफा डेटा बाध्यकारी कैसे कार्यान्वित किया जाए, लेकिन कोई भी जिसने अवधारणा को समझाया नहीं। आपकी पोस्ट ने और काफी संक्षेप में किया था। –

+0

इसके लिए धन्यवाद, विशेष रूप से कथन "कुछ गुण डिफ़ॉल्ट रूप से दो-तरफा बांधते हैं: टेक्स्टबॉक्स। टेक्स्ट, उदाहरण के लिए, डिफ़ॉल्ट रूप से दोवे बांधता है" इससे बहुत मदद मिली :) – sergeantKK