2009-07-23 17 views
21

मैं कैसे संलग्न गुण वास्तव में या तो माता-पिता या बच्चे तत्वों को उनके मूल्यों को व्यक्त करने के रूप में एक सा चक्कर में पड़ कर रहा हूँ। TextElement.FontFamily बच्चे के तत्वों को उस संपत्ति को निर्दिष्ट मूल्य का वारिस करने का कारण बनता है (एक प्रतीत होता है डाउनस्ट्रीम ऑपरेशन, बच्चे के लिए माता-पिता)। Grid.Column किसी खास स्थान पर है कि बच्चे (एक मालूम होता है नदी के ऊपर आपरेशन, माता-पिता के लिए बच्चे) प्रदर्शित करने के लिए एक माता पिता के आइटम का कारण बनता है। संलग्न संपत्ति मूल्यों को या तो प्रवाह या नीचे कैसे जाना जाता है? क्या यह मेरी गलत धारणा है, या क्या कोई टुकड़ा गुम है जो इसे सब परिप्रेक्ष्य में रखेगा?WPF में संलग्न गुण वास्तव में कैसे काम करते हैं?

<StackPanel TextElement.FontFamily="Wingdings"> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="*"/> 
      <ColumnDefinition Width="*"/> 
     </Grid.ColumnDefinitions> 

     <Button Grid.Column="1" Content="My Button"/> 
    </Grid> 
</StackPanel> 

उत्तर

38

यहाँ दो अवधारणाओं रहे हैं। "संलग्न गुण" निर्भरता गुण हैं, और इस तरह के समर्थन निर्भरता property value inheritance के रूप में।

बुनियादी निर्भरता गुण के बारे में, एक बहुत ही किसी न किसी तरह बयान किया जाएगा कि वे मूल रूप से WPF (तार्किक/दृश्य) पेड़ में माता पिता के तत्वों से उनके मूल्यों के वारिस। एक निर्भरता संपत्ति (संलग्न या नहीं) इसके मान को "नीचे" मानती है यदि metadataFrameworkPropertyMetadataOptions के साथ सेट है। इनरिट ध्वज, और कई मामलों में ऐसा है।

संलग्न गुण गुण जो किसी भी WPF वस्तु पर सेट किया जा सकता हैं (मूल रूप से, कम से कम एक DependencyObject) DependencyObject.SetValue विधि के माध्यम से। इस तंत्र का उद्देश्य माता-पिता वस्तुओं द्वारा आवश्यक अन्य वस्तुओं की जानकारी को "संलग्न" करना है, न कि बच्चे स्वयं वस्तुओं को। उदाहरण के लिए, Grid.Row ग्रिड द्वारा अपने रेंडर क्षेत्र में आइटम रखने के लिए आवश्यक एक संलग्न संपत्ति है।

निर्भरता गुण WPF वस्तु प्रणाली द्वारा "नीचे की ओर" विरासत में मिला रहे स्वचालित रूप से।

संलग्न गुणों को विशिष्ट वस्तुओं के कोड में स्पष्ट रूप से "ऊपर" की जांच की जाती है। ग्रिड के मामले में, यह निर्धारित करने के लिए कि इसकी वस्तुओं को कहां रखा जाए, यह प्रत्येक निहित आइटम पर ग्रिड.रो और ग्रिड। कॉलम संलग्न गुणों के मूल्य की जांच करता है।

यह अक्सर कस्टम संलग्न गुण बनाने की तकनीक भी है जो किसी भी तरीके से संशोधित वस्तुओं को संशोधित करता है (उदाहरण के लिए, Drag'n'Drop functionality via attached properties)।

एक अतिरिक्त नोट के रूप में, एक विरासत में संलग्न संपत्ति का एक अच्छा उदाहरण TextElement.FontFamily है। ग्रिड.रो और ग्रिड। कॉलम गुणों में इनहेरिट्स फ्लैग सेट नहीं है।

TextElement.FontFamily, परावर्तक से:

FontFamilyProperty = DependencyProperty.RegisterAttached("FontFamily", typeof(FontFamily), typeof(TextElement), new FrameworkPropertyMetadata(SystemFonts.MessageFontFamily, FrameworkPropertyMetadataOptions.Inherits | FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.AffectsMeasure), new ValidateValueCallback(TextElement.IsValidFontFamily)); 

Grid.Row, परावर्तक से:

RowProperty = DependencyProperty.RegisterAttached("Row", typeof(int), typeof(Grid), new FrameworkPropertyMetadata(0, new PropertyChangedCallback(Grid.OnCellAttachedPropertyChanged)), new ValidateValueCallback(Grid.IsIntValueNotNegative)); 
+1

दिलचस्प और जानकारीपूर्ण। इस परिदृश्य के बारे में क्या, हालांकि: 2x2 ग्रिड (ए) में 2x2 ग्रिड (बी) होता है। ग्रिड बी में एक बटन होता है। यदि ग्रिड बी में यह ग्रिड है।कॉलम संलग्न संपत्ति 1 पर सेट है (इसलिए यह अपने माता-पिता ग्रिड, ग्रिड ए के दूसरे कॉलम में दिखाई देता है), क्या यह नहीं होना चाहिए कि संलग्न संपत्ति ग्रिड बी के बटन पर नीचे की ओर बढ़ जाए, तो बटन ग्रिड बी के दूसरे कॉलम में दिखाई देता है? – Pwninstein

+1

अच्छा सवाल, उत्तर में जानकारी जोड़ा गया। –

+0

बहुत बढ़िया! अब बहुत अधिक समझ में आता है, धन्यवाद !! – Pwninstein

2

MSDN से:

हालांकि संलग्न गुण किसी भी वस्तु पर settable हैं, जो स्वचालित रूप से इसका मतलब यह नहीं है कि संपत्ति की स्थापना एक ठोस परिणाम का उत्पादन करेगा, या मूल्य कभी किसी अन्य वस्तु द्वारा उपयोग किया जाएगा कि। आम तौर पर, संलग्न गुण का इरादा कर रहे हैं ताकि संभव वर्ग पदानुक्रम या तार्किक रिश्तों की एक विस्तृत विविधता से आ रही वस्तुओं प्रत्येक प्रकार कि संलग्न संपत्ति को परिभाषित करता है के लिए आम सूचना रिपोर्ट कर सकते हैं। प्रकार है कि संलग्न संपत्ति को परिभाषित करता है आम तौर पर इन मॉडलों में से एक इस प्रकार है:

  • प्रकार परिभाषित करता है कि संलग्न संपत्ति इतना है कि यह तत्वों कि के लिए मान सेट करेगा की मूल तत्व हो सकता है डिज़ाइन किया गया है संलग्न संपत्ति। प्रकार तो किसी वस्तु वृक्ष संरचना के खिलाफ आंतरिक तर्क के माध्यम से अपने बच्चे वस्तुओं iterates, मान प्राप्त है, और किसी तरह से उन मूल्यों पर कार्य करता है।

  • प्रकार है कि संलग्न संपत्ति को परिभाषित करता है संभव माता पिता तत्वों और सामग्री मॉडल की एक किस्म के लिए बच्चे तत्व के रूप में इस्तेमाल किया जाएगा।

  • प्रकार है कि संलग्न संपत्ति को परिभाषित करता है एक सेवा का प्रतिनिधित्व करता है। अन्य प्रकार संलग्न संपत्ति के लिए मूल्यों को निर्धारित। फिर, जब तत्व को सेट किया गया है, तो सेवा के संदर्भ में संपत्ति का मूल्यांकन किया जाता है, संलग्न संपत्ति मान सेवा कक्षा के आंतरिक तर्क के माध्यम से प्राप्त किए जाते हैं।

एक का उदाहरण एक जनक निर्धारित संलग्न संपत्ति

सबसे विशिष्ट परिदृश्य में जहाँ WPF को परिभाषित करता है जब एक माता पिता तत्व चाइल्ड तत्व संग्रह का समर्थन करता है, और यह भी एक व्यवहार को लागू करता है एक संलग्न संपत्ति है, जहां व्यवहार के विनिर्देश प्रत्येक बच्चे तत्व के लिए अलग-अलग रिपोर्ट किए जाते हैं।

डॉकपैनल डॉकपैनेल को परिभाषित करता है। डॉक संलग्न संपत्ति, और डॉकपैनल में इसके प्रतिपादन तर्क (विशेष रूप से, मेजर ओवरराइड और व्यवस्थाज ओवरराइड) के हिस्से के रूप में कक्षा-स्तर कोड होता है। एक डॉकपैनल उदाहरण हमेशा यह देखने के लिए जांच करेगा कि उसके किसी भी तत्काल बाल तत्वों ने डॉकपैनेल के लिए मूल्य निर्धारित किया है। डॉक। यदि ऐसा है, तो वे मान उस विशेष बाल तत्व पर लागू प्रतिपादन तर्क के लिए इनपुट बन जाते हैं। नेस्टेड डॉकपैनल उदाहरण प्रत्येक को अपने स्वयं के तत्काल बाल तत्व संग्रह का इलाज करते हैं, लेकिन यह व्यवहार कार्यान्वयन-विशिष्ट है कि डॉकपैनल DockPanel.Dock मानों को कैसे संसाधित करता है। यह सैद्धांतिक रूप से गुणों को संलग्न करना संभव है जो तत्काल माता-पिता से परे तत्वों को प्रभावित करते हैं। यदि डॉकपैनल।डॉक संलग्न संपत्ति उस तत्व पर सेट की गई है जिसमें उस पर कार्य करने के लिए कोई डॉकपैनल मूल तत्व नहीं है, कोई त्रुटि या अपवाद नहीं उठाया जाता है। इसका मतलब यह है कि एक वैश्विक संपत्ति मूल्य निर्धारित किया गया था, लेकिन इसमें कोई वर्तमान डॉकपैनल माता-पिता नहीं है जो जानकारी का उपभोग कर सकता है। निर्भरता गुण और संलग्न निर्भरता गुण:

0

सरल शब्दों में यह कैसे मैं यह समझ है (कृपया मुझे ठीक कर लें मैं गलत हूँ)।

एक वस्तु (ए) एक संपत्ति है कि किसी अन्य वस्तु (बी) (वस्तु बी भी इस "कुर्की" संपत्ति के अस्तित्व के बारे में पता नहीं है) करने के लिए जोड़ देती है लागू करता है। ऑब्जेक्ट बी को निर्भरता ऑब्जेक्ट से प्राप्त करने की आवश्यकता है।

वस्तु एक भी अन्य वस्तुओं में यह "कुर्की" संपत्ति की जांच करने के लिए एक स्थिर विधि को लागू करता है, A.GetAttachedProperty (बी)।

तो बी ए से जुड़ी संपत्ति है, A.GetAttachedProperty पढ़ सकते हैं और यह मान वापस आ जाएगी। अन्यथा ए इसे पढ़ने की कोशिश करेगा, और शून्य से वापस आ जाएगा क्योंकि यह वहां नहीं है।

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