2009-07-04 16 views
50

से पैरामीटरयुक्त कन्स्ट्रक्टर को कॉल करना WPF का उपयोग करते समय मैंने देखा कि जब मैं XAML फ़ाइल में नियंत्रण जोड़ता हूं, तो डिफ़ॉल्ट कन्स्ट्रक्टर को कॉल किया जाता है।एक्सएएमएल

क्या पैरामीटरयुक्त कन्स्ट्रक्टर को कॉल करने का कोई तरीका है?

+0

कृपया मेरे सवाल पर एक नज़र डालें http://stackoverflow.com/questions/15735830/wpf-best-practice-of-registering-a-delegatecommand-to-a-compositecommand –

उत्तर

11

नहीं। एक्सएएमएल से नहीं [डब्ल्यूपीएफ का उपयोग करते समय]।

66

.NET 4.0 एक नई सुविधा लाता है जो उत्तर को चुनौती देता है।

x:Arguments Directive

<object ...> 
    <x:Arguments> 
     oneOrMoreObjectElements 
    </x:Arguments> 
</object> 
+0

अच्छा, मैं तुम्हें खुश हूँ इसे लाया –

+1

http://www.wpftutorial.net/XAML2009.html –

+23

पर एक और पोस्ट यहां किसी और के लिए जो वास्तव में इस उत्तर की तलाश में आया, मैं आपको कुछ समय बचाऊंगा क्योंकि आप इस पोस्ट को अगले के बारे में ढूंढ रहे हैं: http: //stackoverflow.com/questions/14347181/how-to-fix-xaml2009- भाषा-construct-is-not-allowed-here – Kevek

21

मुझे पता है मैं देर से पार्टी के लिए यहाँ हूँ, लेकिन जब से कोई भी वास्तव में WPF सम्मेलनों को संबोधित किया, मैंने सोचा कि मैं में झंकार चाहते हैं।

के मार्गदर्शक सिद्धांत में से एक एक्सएएमएल-अनुकूल ऑब्जेक्ट्स यह है कि उन्हें एक डिफ़ॉल्ट कन्स्ट्रक्टर के साथ पूरी तरह उपयोग करने योग्य होना चाहिए, यानी, ऐसा कोई व्यवहार नहीं है जो गैर-डिफ़ॉल्ट कन्स्ट्रक्टर का उपयोग करते समय केवल पहुंच योग्य हो। XAML की घोषणात्मक प्रकृति के साथ फिट करने के लिए, ऑब्जेक्ट पैरामीटर को संपत्ति सेटर्स के माध्यम से निर्दिष्ट किया जाता है। एक ऐसा सम्मेलन भी है जो कहता है कि जिस क्रम में एक्सएएमएल में गुण निर्धारित किए गए हैं, वह महत्वपूर्ण नहीं होना चाहिए।

आप कर सकते हैं, हालांकि, कुछ विशेष विचार है कि अपने कार्यान्वयन के लिए महत्वपूर्ण हैं, लेकिन सम्मेलन के साथ अंतर पर:

  1. आप एक या अधिक गुण जो वस्तु से पहले निर्धारित किया जाना चाहिए हो सकता है इस्तेमाल किया जा सकता ।
  2. दो या दो से अधिक गुण एक दूसरे के साथ पारस्परिक रूप से अनन्य हो सकते हैं, उदाहरण के लिए, किसी छवि के StreamSource और UriSource दोनों को सेट करने का कोई मतलब नहीं है।
  3. आप यह सुनिश्चित करना चाहते हैं कि संपत्ति केवल प्रारंभिकरण के दौरान सेट हो।
  4. एक संपत्ति दूसरे पर निर्भर हो सकती है, जो गुणों को सेट करते समय आजादी के उपरोक्त सम्मेलन के उपरोक्त सम्मेलन के कारण मुश्किल हो सकती है।

इन मामलों को संभालने में आसान बनाने के लिए, ISupportInitialize इंटरफ़ेस प्रदान किया जाता है। जब एक वस्तु पढ़ सकते हैं और (जैसे कि, पार्स) XAML से बनाया जाता है, ISupportInitialize को लागू वस्तुओं विशेष रूप से नियंत्रित किया जाएगा:

  1. डिफ़ॉल्ट निर्माता बुलाया जाएगा।
  2. BeginInit() कहा जाएगा।
  3. गुण XAML घोषणा में दिखाई देने के क्रम में सेट किए जाएंगे।
  4. EndInit() कहा जाता है।
BeginInit() को

होने वाले कॉल का धीरे-धीरे EndInit(), आप संभाल कर सकते हैं जो कुछ भी आप की आवश्यकता है कि कुछ गुण सेट किया जा सहित लागू करने के लिए की जरूरत है, नियम। इस तरह आपको सृजन पैरामीटर को संभालना चाहिए; कन्स्ट्रक्टर तर्क की आवश्यकता नहीं है।

ध्यान दें कि ISupportInitializeNotification भी प्रदान किया गया है, जो IsInitialized संपत्ति और Initialized ईवेंट जोड़कर उपरोक्त इंटरफ़ेस को बढ़ाता है। मैं विस्तारित संस्करण का उपयोग करने की सलाह देते हैं।

0

हां, आप इसे ObjectDataProvider द्वारा कर सकते हैं। यह आप गैर डिफ़ॉल्ट निर्माता, उदाहरण के लिए कॉल करने के लिए अनुमति देता है:

<Grid> 
    <Grid.Resources> 
     <ObjectDataProvider x:Key="myDataSource" 
          ObjectType="{x:Type local:Person}"> 
      <ObjectDataProvider.ConstructorParameters> 
       <system:String>Joe</system:String> 
      </ObjectDataProvider.ConstructorParameters> 
     </ObjectDataProvider> 
    </Grid.Resources> 
    <Label Content="{Binding Source={StaticResource myDataSource}, Path=Name}"></Label> 
</Grid> 

कि व्यक्ति संभालने

public class Person 
{ 
    public Person(string Name) 
    { 
     this.Name = Name; 
    } 
    public string Name { get; set; } 
} 

दुर्भाग्य से आप ConstructorParameters को नहीं बांध सकता है। कुछ कामकाज देखें here

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