2012-07-17 9 views
5

Im avendo problemi di riferimento classi in xaml da altri assembly.MC3074 - il tipo non esiste in "clr-namespace ..."

Nella stessa soluzione, ho due progetti. Uno chiamato Controlli (per contenere i controlli utente) e uno chiamato DataBinding (in possesso di convertitori/regole di convalida). In un controllo, im tentando di riferimento una regola di convalida in XAML:

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

Il mio progetto fa riferimento al progetto che contiene le mie lezioni. Ive ha aggiunto questa dichiarazione in cima alla mia Control.xaml:

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

Tuttavia, quando compilo, ottengo un errore:

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

La classe esiste sicuramente, posso chiamarlo nel codice dietro senza problemi, ma non via xaml. Se sposto la classe nello stesso progetto, di nuovo, non ho problemi. Ho visto altre domande su qui, e hanno provato quanto segue:

  1. pulizia e la ricostruzione di tutti i progetti rilevanti
  2. garantendo a tutti i progetti stanno prendendo di mira la stessa versione di .Net (4.0, completa Profilo)
  3. Rimozione definizione 'assembly' dalla fine della definizione del namespace.

Nessuno dei precedenti ha funzionato. Qualche suggerimento su dove sto andando storto?

EDIT

mio FileExists Validator:

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; 
     } 
    } 
} 

posso chiamare il seguente nel codice dietro senza errori:

new GuiParts.DataBinding.Validators.FileExistsRule(); 

Così Ive ha ottenuto i miei spazi dei nomi, ecc corretta.

+0

Non Sei metodo può essere un 1 istruzione linea: 'restituisce File.Exist (valore (stringa))? new ValidationResult (false, "File inesistente."): new ValidationResult (true, null); ' –

+0

Mai capito? –

risposta

3

Prova questa:

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

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

+1 Questo mi ha aiutato, ho bisogno di specificare l'assemblea. – SwDevMan81

2
  1. La tua classe nell'assemblea di destinazione è pubblica?
  2. Il campo in Validator è pubblico?
  3. Il tuo spazio dei nomi è GuiParts.DataBinding corretto?
+0

Domanda modificata con maggiori dettagli – richzilla

+0

Queste domande erano necessarie in quel momento perché la domanda aveva così pochi dettagli questo era l'unico consiglio che si poteva fornire. Si prega di considerare che al momento del voto. –

2

Mentre io non sono sicuro che il problema riscontrato è, in alternativa è possibile creare una definizione dello spazio dei nomi più amichevole per la vostra Assemblea e CLR spazi dei nomi. In effetti, io uso questa tecnica per raggruppare diversi spazi dei nomi in uno spazio dei nomi XML ... Lo fai usando lo XmlnsPrefixAttribute e lo XmlnsDefinitionAttribute s.

Ad esempio:

[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")] 

Poi, quando si desidera fare riferimento alla XMLNamespace in XAML è sufficiente fare:

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

nota, io uso ReSharper, ma sono certo questo funziona naturalmente anche in Visual Studio. Se non si digita l'importazione xmlns e si tenta di utilizzare un oggetto nello spazio dei nomi, quando si risolve il problema verrà utilizzato automaticamente lo spazio dei nomi più amichevole con il prefisso specificato. Inoltre, è davvero bello e ti aiuta ad evitare una relazione 1: 1 tra spazi dei nomi xml e spazi dei nomi clr perché puoi mappare più spazi dei nomi clr in un unico spazio dei nomi xml.

Ancora una volta, non sono sicuro di quale sia il problema specifico, ma probabilmente lo risolverò e sarà meglio che utilizzare clr-namespace e informazioni sull'assembly. Assicurati di trovare qualcosa di unico in modo da non incorrere in collisioni xmlns o dovrai tornare a clr/assembly namespacing.


Oh, e un'ultima cosa ... se si desidera utilizzare il controllo delle versioni nel vostro schema XML namespace di denominazione (che si dovrebbe), non preoccuparti di chiudersi in per la compatibilità all'indietro. È sempre possibile utilizzare lo XmlnsCompatibleWithAttribute per garantire che il codice che utilizzava il vecchio spazio dei nomi amichevole non si interrompesse se si aggiornano gli assembly esterni per eseguire il mapping su uno spazio dei nomi xml più recente.

Ad esempio, se si ha in origine si sta assemblea che punta a uno spazio dei nomi 2012, poi commutato in un namespace 2013 perché aggiornati l'assemblaggio ...

// 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")] 
Problemi correlati