2012-07-17 16 views
5

मुझे अन्य असेंबली से xaml में कक्षाओं का संदर्भ देने में परेशानी हो रही है।MC3074 - प्रकार "clr-namespace ..." में मौजूद नहीं है

उसी समाधान में, मेरे पास दो परियोजनाएं हैं। एक को नियंत्रण कहा जाता है (उपयोगकर्ता नियंत्रण को पकड़ने के लिए) और जिसे डेटाबाइंडिंग कहा जाता है (होल्डिंग कन्वर्टर्स/सत्यापन नियम)। एक नियंत्रण में, मैं xaml में एक सत्यापन नियम का संदर्भ देने का प्रयास कर रहा हूं:

<Binding.ValidationRules> 
    <databind:Validators.FileExistsRule /> 
</Binding.ValidationRules> 

मेरा प्रोजेक्ट मेरी कक्षाओं वाली परियोजना का संदर्भ देता है। Ive मेरी Control.xaml के शीर्ष पर इस घोषणा कहा:

The tag 'Validators.FileExistsRule' does not exist in XML namespace 'clr-namespace:GuiParts.DataBinding;assembly=DataBinding'. 

वर्ग निश्चित रूप से मौजूद है, मैं इसे कोड में कॉल कर सकते हैं:

xmlns:databind="clr-namespace:GuiParts.DataBinding;assembly=DataBinding" 

हालांकि, जब मैं संकलन, मैं कोई त्रुटि मिलती है बिना किसी समस्या के पीछे, लेकिन xaml के माध्यम से नहीं। यदि मैं कक्षा को उसी प्रोजेक्ट में ले जाता हूं, तो मुझे कोई समस्या नहीं है। Ive यहाँ पर अन्य प्रश्न देखा है, और निम्नलिखित की कोशिश की है:

  1. सफाई और सभी प्रासंगिक परियोजनाओं
  2. सभी परियोजनाओं को सुनिश्चित करना पुनर्निर्माण नेट (4.0, पूर्ण प्रोफ़ाइल) के समान संस्करण
  3. लक्षित कर रहे हैं निकाला जा रहा है नामस्थान परिभाषा के अंत से 'असेंबली' परिभाषा।

उपरोक्त में से कोई भी काम नहीं किया है। कोई सुझाव है कि मैं कहां गलत हो रहा हूं?

संपादित

मेरे fileexists सत्यापनकर्ता:

namespace GuiParts.DataBinding.Validators 
{ 
    /// <summary> 
    /// Validates that the file with the specified name exists 
    /// </summary> 
    public class FileExistsRule : ValidationRule 
    { 
     public override ValidationResult Validate(object value, CultureInfo cultureInfo) 
     { 
     ValidationResult res = null; 
     res = (! File.Exists((string)value)) 
        ? new ValidationResult(false, "File does not exist") 
        : new ValidationResult(true, null); 
     return res; 
     } 
    } 
} 

मैं पीछे किसी भी त्रुटि के बिना कोड में निम्नलिखित कॉल कर सकते हैं:

new GuiParts.DataBinding.Validators.FileExistsRule(); 

तो Ive मेरी नामस्थान आदि का सही उत्तर दिया।

+0

तुम हो विधि एक 1 हो सकता है लाइन स्टेटमेंट: 'वापसी फ़ाइल। एक्सिस्टिस्ट ((स्ट्रिंग) मान)? नया प्रमाणीकरण परिणाम (झूठी, "फ़ाइल मौजूद नहीं है।"): नया प्रमाणीकरण परिणाम (सत्य, शून्य); ' –

+0

कभी इसे समझें? –

उत्तर

3

इस प्रयास करें:

xmlns:databind="clr-namespace:GuiParts.DataBinding.Validators;assembly=DataBinding" 

<Binding.ValidationRules>  
    <databind:FileExistsRule />  
</Binding.ValidationRules> 
+0

+1 इससे मुझे मदद मिली, मुझे असेंबली निर्दिष्ट करने की आवश्यकता थी। – SwDevMan81

2
  1. क्या आपकी कक्षा आपके लक्षित असेंबली में सार्वजनिक है?
  2. Validators, सार्वजनिक में क्षेत्र है?
  3. क्या आपका नाम स्थान GuiParts.DataBinding सही है?
+0

अधिक जानकारी के साथ संपादित प्रश्न – richzilla

+0

उस समय ये प्रश्न जरूरी थे क्योंकि सवाल इतनी कम जानकारी थी कि यह एकमात्र सलाह थी जो कोई प्रदान कर सकती थी। कृपया मतदान करते समय विचार करें। –

2

जबकि मुझे यकीन है कि क्या आपको आ रही समस्या है नहीं कर रहा हूँ, आप वैकल्पिक रूप से अपने विधानसभा और CLR नामस्थान के लिए एक दोस्ताना नाम स्थान परिभाषा बना सकते हैं। असल में, मैं इस तकनीक का उपयोग विभिन्न नामस्थानों को एक एक्सएमएल नेमस्पेस में समूहित करने के लिए करता हूं ... आप इसे XmlnsPrefixAttribute और XmlnsDefinitionAttribute एस का उपयोग करके करते हैं।

उदाहरण के लिए:

[assembly: XmlnsPrefix("http://my.xml.namespace.com/", "databind")] 
[assembly: XmlnsDefinition("http://my.xml.namespace.com/", 
    "GuiParts.DataBinding")] 
[assembly: XmlnsDefinition("http://my.xml.namespace.com/", 
    "GuiParts.DataBinding.Validators")] 

तब, जब आप अपने XAML में xmlnamespace संदर्भ लेना चाहते हैं तो आप बस कार्य करें:

xmlns:databind="http://my.xml.namespace.com/" 

ध्यान दें, मैं ReSharper का उपयोग करें, लेकिन मैं कर रहा हूँ यकीन है कि यह विजुअल स्टूडियो में स्वाभाविक रूप से भी काम करता है। यदि आप xmlns आयात में टाइप नहीं करते हैं और नामस्थान में किसी ऑब्जेक्ट का उपयोग करने का प्रयास करते हैं, तो जब आप इसे हल करने के लिए जाते हैं तो यह निर्दिष्ट उपसर्ग के साथ मित्र नामित नामस्थान का स्वचालित रूप से उपयोग करेगा। साथ ही, यह वास्तव में अच्छा है और आपको एक्सएमएल नेमस्पेस और क्लियर नेमस्पेस के बीच 1: 1 रिलेशनशिप रखने से बचने में मदद करता है क्योंकि आप एकाधिक क्लियर नेमस्पेस को एक एक्सएमएल नेमस्पेस में मैप कर सकते हैं।

फिर से, मुझे यकीन नहीं है कि आपके पास विशेष रूप से क्या समस्या है, लेकिन यह शायद इसे ठीक करेगा और क्लियर-नेमस्पेस और असेंबली जानकारी का उपयोग करने से बेहतर होगा। बस कुछ अद्वितीय के साथ आना सुनिश्चित करें ताकि आप xmlns टकराव में भाग न सकें या आपको क्लियर/असेंबली नेमस्पेसिंग पर वापस जाना होगा।


ओह, और एक आखिरी बात ... अपनी xml नाम स्थान नामकरण योजना में संस्करण (जो आप चाहिए), अपने आप को पीछे की ओर संगतता के लिए में लॉक करने के बारे में चिंता मत करो का उपयोग करना चाहते हैं तो। आप हमेशा XmlnsCompatibleWithAttribute का उपयोग यह सुनिश्चित करने के लिए कर सकते हैं कि पुराना दोस्ताना नेमस्पेस का उपयोग करने वाला कोड तोड़ नहीं देता है यदि आपने कभी भी अपने बाहरी असेंबली को किसी नए xml नेमस्पेस पर मैप करने के लिए अपडेट किया है।

उदाहरण के लिए, यदि आप मूल रूप से आप विधानसभा 2012 नाम स्थान की ओर इशारा करते रहे था, तो यह 2013 नाम स्थान में स्विच क्योंकि आप विधानसभा अद्यतन ...

// Previous Assembly version 
//[assembly: XmlnsDefinition("http://schemas.xyzcorp.com/wpf/2012", 
// "Xyz.Databinding")] 

[assembly: XmlnsCompatibleWith("http://schemas.xyzcorp.com/wpf/2012", 
    "http://schemas.xyzcorp.com/wpf/2013")] 
[assembly: XmlnsDefinition("http://schemas.xyzcorp.com/wpf/2013", 
    "Xyz.Databinding")] 
संबंधित मुद्दे