2009-11-30 19 views
10

क्या MarkupExtension व्युत्पन्न कक्षा के भीतर संभव है?मार्कअप एक्सटेंशन के भीतर निर्भरताप्रॉपर्टी

public class GeometryQueryExtension : MarkupExtension 
{ 
    public XmlDataProvider Source { get; set; } 

    public string XPath { get; set; } 

    public static readonly DependencyProperty ArgumentProperty = DependencyProperty.RegisterAttached(
     "Argument", 
     typeof(string), 
     typeof(GeometryQueryExtension)); // this wont work because GeometryQueryExtension is not a DependencyProperty 

    public string Argument 
    { 
     get 
     { 
      return (string)GetValue(ArgumentProperty); // this wont even compile because GeometryQueryExtension doesnt derive from a class which has GetValue 
     } 
     set 
     { 
      SetValue(ArgumentProperty,value);// this wont even compile because GeometryQueryExtension doesnt derive from a class which has SetValue 
     } 
    } 
} 

विस्तार निम्न स्निपेट में उपयोग किया जाता है।

<Label.Content> 
    <local:GeometryQueryExtension Source="{StaticResource shapesDS}"> 
     <local:GeometryQueryExtension.XPath> 
      /Shapes/Geometry/{0} 
     </local:GeometryQueryExtension.XPath> 
     <local:GeometryQueryExtension.Argument> 
      <Binding XPath="Geometry"/> <!-- will throw exception when processing this bind --> 
     </local:GeometryQueryExtension.Argument> 
    </local:GeometryQueryExtension> 
</Label.Content> 

क्या ऐसा एक्सटेंशन बनाना संभव है या मैं सिर्फ गलत पेड़ को भड़क रहा हूं? (उपरोक्त कोड संकलित और चलाएगा, लेकिन मैंने इसे समस्या को सबसे अच्छी तरह से चित्रित करने के लिए यहां पोस्ट किया है)।

उत्तर

5

नहीं, आप केवल निर्भरता गुण है कि DependencyObject से प्राप्त कर रहे वर्गों के लिए जोड़ सकते हैं, MarkupExtention वस्तु

+0

उस मामले में बाध्यकारी मार्कअप एक्सटेंशन के बारे में क्या? इसकी संपत्तियों को अपने आप से बंधे जा सकते हैं, इसलिए वे निर्भरता गुण हैं। – Narek

+0

@Narek - एमएसडीएन के मुताबिक बाध्यकारी मार्कअप एक्सटेंशन में निर्भरता गुण नहीं हैं, यह समझ में आता है क्योंकि आप निर्भरता गुणों को लागू नहीं कर सकते हैं निर्भरता ऑब्जेक्ट .etValue और DependencyObject.GetValue और आप निर्भरता ऑब्जेक्ट से विरासत के बिना उनको कॉल नहीं कर सकते हैं। भी, मैं अभी इसका परीक्षण नहीं कर सकता लेकिन मुझे नहीं लगता कि आप बाइंडिंग की अपनी संपत्तियों पर बाध्यकारी का उपयोग कर सकते हैं, जो आप नहीं कर सकते हैं {बाध्यकारी कनवर्टर = {बाध्यकारी ...}} – Nir

+0

वास्तव में मेरे पास नहीं है डब्ल्यूपीएफ में कोई अनुभव, लेकिन सिल्वरलाइट 5 में बाध्यकारी की अपनी संपत्तियों पर बाध्यकारी का उपयोग करना निश्चित रूप से संभव है। यहां एक उदाहरण दिया गया है: "{बाध्यकारी उपयोगकर्ता नाम, सापेक्ष स्रोत = {सापेक्ष स्रोत ढूँढें पूर्वजों, पूर्वज प्रकार = उपयोगकर्ता नियंत्रण}}"। – Narek

0

हां से सीधे प्राप्त होता है .. यह एक बदसूरत समस्या यह एक साधारण गैर सहज उत्तर है है .. हालांकि। स्थिर संसाधन प्राप्त करने के लिए एक और मार्कअप एक्सटेंशन बनाएं। तो बजाय {StaticResource shapesDS}

आप DataSetLocator

नामक एक नया MarkupExtension मैं कोड लिखने के लिए नहीं जा रहा हूँ बन जाएगा लेकिन प्रदान करें मूल्य का उपयोग कर एक नाम या कुछ अन्य इनपुट के आधार पर आपके डेटासेट वापस जाने के लिए की आवश्यकता होगी।

तो फिर आप अपने एक्सटेंशन का उपयोग डाटासेट लोकेटर एक्सटेंशन उदाहरण Source="{DataSetLocator name=shapesDS }"

यह बहुत बुरा है कि एक्सटेंशन DependencyProperty का विस्तार नहीं है, लेकिन वे नहीं करते है करने के लिए अपने XAML बदल जाते हैं।

-1

बस मार्कअप एक्सटेंशन के बजाय IMarkupExtension का उपयोग करें और आप निर्भरता ऑब्जेक्ट का विस्तार कर सकते हैं। कम से कम सिल्वरलाइट 5 में आप कर सकते हैं, लेकिन मुझे लगता है कि डब्ल्यूपीएफ में भी यह है।

+6

डब्ल्यूपीएफ में IMarkupExtension नहीं है। – Brian