2012-08-16 9 views
13

मैं अपने Xaml में कई अलग अलग गुण बाध्य करने के लिए कोशिश कर रहा हूँ:मैं रिलेटिवसोर्स सेल्फ से कैसे जुड़ूं?

<Label Content="{Binding Description}" 
Visibility="{Binding Path=DescriptionVisibility, 
ElementName=_UserInputOutput}"    
FontSize="{Binding Path=FontSizeValue, ElementName=_UserInputOutput}" 
HorizontalAlignment="Left" VerticalAlignment="Top" Padding="0" /> 

आपने गौर करेंगे मैं यहाँ दो अलग बंधन तकनीक का इस्तेमाल किया है। तत्व नाम का उपयोग करने वाले लोग, दूसरा नहीं है। यहाँ कोड के पीछे है:

public string Description 
{ 
    get { return (string)GetValue(DescriptionProperty); } 
    set { SetValue(DescriptionProperty, value); } 
} 
public static readonly DependencyProperty DescriptionProperty = 
DependencyProperty.Register("Description", typeof(string), typeof(UserControl), 
new UIPropertyMetadata("")); 

प्रत्येक बाध्यकारी एक अलग नाम है लेकिन वे सभी अधिकांश भाग के लिए इस तरह दिखेगा। मैं अपने साथ काम करने में सक्षम होने की बाइंडिंग हैं:

{Binding Description} 

बजाय:

{Binding Path=Description, ElementName=_UserInputOutput} 

यह केवल काम करने जब ElementName प्रयोग किया जाता है लगता है। मुझे इस एक्सएएमएल को निर्यात/आयात करने की ज़रूरत है, इसलिए मेरे पास एलिमेंटनाम नहीं हो सकता है या आयात काम नहीं करेगा।

मुझे लगा कि यह सबसे अच्छा होगा:

{Binding Path=Description, RelativeSource={RelativeSource Self}} 

यह काम नहीं किया।

कोई विचार ?? धन्यवाद!

+0

[यह आलेख] (http://blogs.msdn.com/b/wpfsldesigner/archive/2010/06/30/debugging-data- बाइंडिंग-in-a-wpf-or-silverlight-application.aspx) रुचि का हो सकता है। –

उत्तर

26

आपने डेटाकॉन्टेक्स्ट सेट नहीं किया है, जो सापेक्ष स्रोत यह निर्धारित करने के लिए उपयोग कर रहा है कि यह क्या सापेक्ष है। आपको UserControl की तरह उच्च स्तर पर DataContext सेट करने की आवश्यकता है। मेरे पास आमतौर पर है:

<UserControl ... DataContext="{Binding RelativeSource={RelativeSource Self}}"> 
</UserControl> 

यह उपयोगकर्ता नियंत्रण को कोडबेंड में कक्षा को बांधने के लिए कहता है।

+0

आप अद्भुत हैं !!!!!! वू हू! यह काम करता हैं! –

+12

"यह निर्धारित करने के लिए कि रिश्तेदार स्रोत क्या उपयोग कर रहा है, वह यह है कि" यह कथन सादा गलत है। उपयोगकर्ता नियंत्रण के डेटाकॉन्टेक्स्ट को भी सेट करना शायद ही कभी एक अच्छा विचार है ... –

+2

मुझे लगता है कि यह एक अच्छा विचार नहीं है क्योंकि यह एमवीवीएम प्रतिमान का उल्लंघन करता है: जब हम एमवीवीएम के साथ डब्ल्यूपीएफ का उपयोग करना चाहते हैं तो हमारे पास एक व्यूमोडेल से जुड़ा हुआ दृश्य है। तो दृश्य के पीछे कोड के निर्माता के अंदर हम कहते हैं 'देखें() {InitializeComponent(); DataContext = नया व्यू मॉडेल(); } ' यह सभी डेटा बाइंडिंग ऑपरेशंस को ViewModel पर काम करता है ताकि हम व्यूमोडेल से दृश्य को अलग कर सकें। – codingdave

29

{RelativeSource Self} लक्ष्य उद्देश्य यह है कि संपत्ति है कि बाध्य किया जा रहा है, अगर आप इस तरह के एक यह एक Label पर बाध्यकारी Label.Description के लिए देखो, जो वहाँ नहीं है जाएगा का मालिक है। इसके बजाय आपको {RelativeSource AncestorType=UserControl} का उपयोग करना चाहिए। एक स्रोत (ElementName, Source, RelativeSource) के बिना

बाइंडिंग UserControls में DataContext के सापेक्ष हैं, फिर भी आपको चाहिए avoid setting the DataContext बाहरी बाइंडिंग के साथ गड़बड़ नहीं है।

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