2014-05-17 4 views
9

न्यूनतम करने के लिए इस सवाल का कम करना, इस MarkupExtension वर्ग पर विचार ...डिफ़ॉल्ट निर्माता पैरामीटर MarkupExtension घोषणा में

public class ProblemStatement : MarkupExtension 
{ 
    private readonly string _first; 
    private readonly string _second; 
    public ProblemStatement(string first, string second) 
    { 
     _first = first; 
     _second = second; 
    } 
    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
     return this; 
    } 
    public override string ToString() 
    { 
     return _first + _second; 
    } 
} 

जब यह Xaml घोषित किया जाता है ...

<Grid> 
    <TextBlock Name="TextBlock1" Tag="{so:ProblemStatement 'hello', 'world'}"/> 
    <TextBlock Text="{Binding ElementName=TextBlock1, Path=Tag}"/> 
</Grid> 

... आप अपेक्षित के रूप में टेक्स्टब्लॉक में 'helloworld' देखें। इस बिंदु पर सब ठीक है।

लेकिन यह करने के लिए निर्माता पैरामीटर को बदलने ...

public ProblemStatement(string first, string second = "nothing") 

... और इस के लिए प्रासंगिक Xaml ...

<Grid> 
     <TextBlock Name="TextBlock1" Tag="{so:ProblemStatement 'hello'}"/> 
     <TextBlock Text="{Binding ElementName=TextBlock1, Path=Tag}"/> 
    </Grid> 

जिसके परिणामस्वरूप त्रुटि संदेश है ...

No constructor for type 'ProblemStatement' has 1 parameters. 

एक कार्य-आसपास है, जो इस कथन को कक्षा में जोड़कर कन्स्ट्रक्टर को चेन करना है ...

public ProblemStatement(string first) : this(first, "not provided") { } 

और इस TextBlock में 'hellonot प्रदान की' में दिखाई देंगे। हालांकि, यह MarkupExtension के अर्थशास्त्र को भी बदलता है और बड़े, 'असली दुनिया' मामले में वांछनीय नहीं है। ओवरलोडिंग की जटिलता नाटकीय रूप से बढ़ जाती है जब अधिक जटिल प्रकारों का उपयोग किया जाता है या कन्स्ट्रक्टर तर्क 'गतिशील' प्रकार के होते हैं। इसके अलावा, उदाहरण के लिए, नए 'कॉलर सूचना' विशेषताओं का उपयोग पूरी तरह अवरुद्ध है।

तो सवाल यह है कि Xaml कैसे घोषित करें ताकि Xaml पार्सर डिफ़ॉल्ट कन्स्ट्रक्टर तर्क का सम्मान करेगा?

उत्तर

8

इस आजमाएं:

public string Optional{ get; set; } = "DefaultValue"; 

    private readonly string _mandatory; 

    public ProblemStatement(string mandatory) 
    { 
     _mandatory = mandatory; 
    } 

उपयोग:

<TextBlock Name="TextBlock1" Tag="{local:ProblemStatement 'hello', Optional=NotDefault}"/> 

वैकल्पिक:

<TextBlock Name="TextBlock1" Tag="{local:ProblemStatement 'hello'}"/> 

परिणाम:

  • कोई XAML parsin जी त्रुटियां
  • वैकल्पिक पैरामीटर के लिए कन्स्ट्रक्टर को अधिभारित करने की कोई आवश्यकता नहीं
  • अनिवार्य पैरामीटर कन्स्ट्रक्टर पैरामीटर हैं।
  • वैकल्पिक पैरामीटर गुण हैं।
+0

'वैकल्पिक' नाम की संपत्ति वास्तव में एक निर्माता तर्क नहीं है क्योंकि इस मामले में 'कन्स्ट्रक्टर एग्रीमेंट एट्रिब्यूट' क्या लाभ प्रदान करता है? मैंने सोचा कि 'कन्स्ट्रक्टर ऑर्ग्यूमेंट एट्रिब्यूट' का उद्देश्य वास्तविक कन्स्ट्रक्टर तर्क और संपत्ति के बीच संबंधों के बारे में एक्सएएमएल सीरियलाइजेशन को बेहतर तरीके से सूचित करना था। –

+0

@AdamCaviness कोई नहीं है। उस समय मुझे इस विशेषता का गलत प्रभाव पड़ा। जवाब तदनुसार संपादित किया गया। –

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