2011-03-30 21 views
40

मेरे WPF प्रोजेक्ट में हैं, मेरे पास एक सूची बॉक्स है जो List<string> संग्रह से आइटम प्रदर्शित करता है। मैं इन वस्तुओं का पाठ संपादन योग्य बनाना चाहता था, इसलिए मैंने उनमें से प्रत्येक को टेक्स्टबॉक्स के साथ आइटम टेम्पलेट में लपेट लिया (शायद सबसे अच्छा तरीका नहीं है, लेकिन मैं WPF के लिए नया हूं)। मुझे टेक्स्टबॉक्स की टेक्स्ट प्रॉपर्टी को प्रत्येक आइटम के मूल्य पर बाध्य करने में परेशानी हो रही थी।"{बाइंडिंग पथ =।}" और "{बाइंडिंग}" वास्तव में

<ListBox ItemsSource="{Binding ElementName=recipesListbox,Path=SelectedItem.Steps}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <TextBox Text="{Binding Path=.}"/> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

क्यों बस {Binding} का उपयोग कर फिर भी मुझे समझ नहीं आता काम नहीं किया: मैं अंत में अपने पथ संपत्ति ({Binding Path=.}) के लिए एक एकल बिंदु पर अथवा अवधि का उपयोग कर एक उदाहरण पर ठोकर खाई।

यह उठाया एक अपवाद है, according to Microsoft के रूप में "दो-तरफा बाध्यकारी पथ या XPath की आवश्यकता है": (।)

[...] अवधि पथ इस्तेमाल किया जा सकता वर्तमान करने के लिए बाध्य करने के लिए स्रोत। उदाहरण के लिए, पाठ के लिए = "{} बाइंडिंग" पाठ के बराबर है = "{बाइंडिंग पथ =।}"

कोई इस अस्पष्ट व्यवहार पर प्रकाश डाला सकता है?

संपादित करें: इसके अलावा, ऐसा लगता है {Binding Path=.} जरूरी पाठ को संशोधित करने और अंतर्निहित स्रोत अपडेट नहीं करता फ़ोकस ले जाने के रूप में, दो तरह से बाध्यकारी नहीं देता है (एक ही स्रोत भी है गुण प्रदर्शित किया है और सफलतापूर्वक एक डेटा ग्रिड पर संशोधित नियंत्रण)। मैं निश्चित रूप से यहाँ कुछ याद कर रहा हूँ।

उत्तर

20

प्रलेखन में कहा गया है कि {Binding}{Binding Path=.} के बराबर है। हालांकि यह {Binding Path} के बराबर है जैसा आपने लिखा है। यदि आप Path संपत्ति शामिल करते हैं, तो आपको इसे कुछ असाइन करना होगा, चाहे वह Path=. या Path=OtherProperty हो।

+2

वह एक टाइपो था, यह अब तय है। – Fueled

+0

लेकिन दो रास्ता बाध्यकारी अभी भी विफल रहता है। यह परिवर्तनों को बचाने से इंकार कर देता है। यदि आपके पास ObsColl है और पथ = करें। मोड = दोवे बाध्यकारी, संग्रह में जोड़ना ठीक काम करता है। उदाहरण के लिए इंडेक्स 0 पर संख्या बदलना। यदि आप इसे डेटाग्रिड बांधते हैं और डेटाग्रिडटेक्स्ट कॉलम निर्दिष्ट करते हैं, तो यह पथ = के साथ सहेजने से इंकार कर देता है। – user99999991

7

ये समान नहीं हैं। यदि आप इसे बाध्य करते हैं जहां कंसोल मैसेज एक अवलोकन योग्य चयन स्ट्रिंग है जो केवल {बाध्यकारी} के साथ है, तो आपको "दो-तरफा बाध्यकारी पथ या XPath की आवश्यकता होती है।" अपवाद जहां {बाइंडिंग पथ =।} काम करता है। इस WPF 4.0 के साथ है ...

<ItemsControl x:Name="ConsoleOutput" ItemsSource="{Binding ConsoleMessages, Mode=OneWay}" MaxHeight="400"> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <TextBox Text="{Binding Path=.}" BorderThickness="0" Margin="0" /> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 

मेरे 2p लायक ...

24

अपवाद की बात शायद आप दो तरह से एक बाध्यकारी स्रोत को नहीं बांध सकता है जो अपने आप है, इसलिए इसे रोकने की कोशिश करता आप एक बाध्यकारी बनाने से जो इस तरह से व्यवहार नहीं करता है जिस तरह से आप चाहते हैं। {Binding Path=.} का उपयोग करके आप केवल त्रुटि प्रबंधन को चालित करते हैं।

(इसके अलावा यह नहीं है कि दस्तावेज के अनसुना है गलत या गलत, हालांकि मैं MSDN प्रलेखीकरण की तरह सामान्य रूप में बहुत कुछ कर के रूप में यह आम तौर पर महत्वपूर्ण अंक एक में रुचि रखता है को शामिल करता है)

+4

+1: यह सही उत्तर है। [मुझे अभी सामना करना पड़ा] (http://stackoverflow.com/a/13089160/149265) यह घटना स्वयं। –

+0

लेकिन दो रास्ता बाध्यकारी अभी भी विफल रहता है। यह परिवर्तनों को बचाने से इंकार कर देता है। यदि आपके पास ObsColl है और पथ = करें। मोड = दोवे बाध्यकारी, संग्रह में जोड़ना ठीक काम करता है। उदाहरण के लिए इंडेक्स 0 पर संख्या बदलना। यदि आप इसे डेटाग्रिड बांधते हैं और डेटाग्रिडटेक्स्ट कॉलम निर्दिष्ट करते हैं, तो यह पथ = के साथ सहेजने से इंकार कर देता है। – user99999991

+0

@ user999999928: यही वह है जो मैं कह रहा हूं: आप बस त्रुटि प्रबंधन को चालित करते हैं। आप एक त्रुटि बनाते हैं जिसे पता नहीं चला है, फिर भी आपको बाध्यकारी नहीं मिलेगा क्योंकि आप अभी भी उस स्रोत से जुड़ते हैं जो परिवर्तनों का पता नहीं लगा सकता है। –

5

संक्षेप में, दोनों के बीच का अंतर पारंपरिक पास के बीच अंतर और संदर्भ द्वारा पारित अंतर के समान है।(यूगोस्लाविय - What's the difference between passing by reference vs. passing by value?)

क्यों बस {बाइंडिंग} काम नहीं किया का उपयोग कर फिर भी मुझे समझ नहीं आता (यह उठाया एक अपवाद "दो-तरफा बाध्यकारी पथ या XPath की आवश्यकता है")

चलें अब के लिए मान लें कि {Binding} दो तरीकों से बाध्यकारी के लिए उपयोग किया जा सकता है। सामान्य रूप से {Binding} डाटाएन्टेक्स्ट के साथ एक मूल्य आधारित लिंक बनाता है जो डेटाकॉन्टेक्स्ट को अद्यतन करने की अनुमति नहीं देता है।

जबकि {Binding Path=.} 'पथ' द्वारा संदर्भित स्मृति क्षेत्र के साथ संदर्भ आधारित लिंक बनाता है जो संदर्भ के माध्यम से मूल्य को अद्यतन करने की अनुमति देता है। (इस मामले में 'डॉट' वर्तमान डेटाकॉन्टेक्स्ट)।

आशा है कि इससे मदद मिलती है!

+0

ByRef और ByVal का उपयोग करके कम से कम मुझे दो बाइंडिंग (पथ और डब्ल्यू/ओ के साथ) को अलग करने के बारे में एक विचार दिया। धन्यवाद! –

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