2012-07-17 18 views
5

从其他程序集中引用xaml中的类时出现问题。“clr-namespace ...”中不存在MC3074 - 类型

在同样的解决方案中,我有两个项目。一个名为Controls(用于保存用户控件)和一个名为DataBinding(保存转换器/验证规则)。在一个控件中,im试图在xaml中引用验证规则:

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

我的项目引用包含我的类的项目。香港专业教育学院在我Control.xaml顶部添加了此声明:

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

然而,当我编译,我得到一个错误:

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

类肯定存在,我可以把它叫做代码后面没有问题,但没有通过xaml。如果我将课程移到同一个项目中,我再也没有问题了。香港专业教育学院看到这里的其他问题,并尝试以下操作:

  1. 清洗和重建的所有相关项目
  2. 确保所有项目都瞄准同一版本的.NET(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(); 

所以香港专业教育学院得到了我的名字空间等正确的。

+0

你方法可以是1行语句:'返回File.Exists((字符串)值)?新的ValidationResult(false,“文件不存在。”):new ValidationResult(true,null);' – 2012-07-17 19:41:53

+0

有没有想到这一点? – 2013-01-08 00:30:23

回答

3

试试这个:

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

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

+1这帮了我,我需要指定程序集。 – SwDevMan81 2014-03-26 20:13:48

2
  1. 您的目标程序集中的课程是否公开?
  2. Validators中的字段是公开的吗?
  3. 您的名字空间GuiParts.DataBinding是否正确?
+0

编辑更多详细问题 – richzilla 2012-07-17 19:28:52

+0

这些问题在当时是必要的,因为问题的细节非常少,这是唯一可以提供的建议。投票时请考虑。 – 2013-04-23 19:13:49

2

虽然我不知道你所遇到的问题是,则可以选择创建您的程序集和CLR命名空间的一个友好的命名空间定义。实际上,我使用这种技术将各种名称空间分组到一个XML命名空间中......您可以使用XmlnsPrefixAttributeXmlnsDefinitionAttribute来执行此操作。

例如:

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

然后,当你要引用的XML命名空间中的XAML中,你只需做:

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

请注意,我用ReSharper的,但我当然,这在Visual Studio中也很自然。如果您没有键入xmlns导入并尝试在名称空间中使用对象,那么当您去解析它时,它将自动使用具有指定前缀的友好名称命名空间。另外,它非常好,可以帮助您避免在xml命名空间和clr命名空间之间建立1:1关系,因为您可以将多个clr命名空间映射到单个xml命名空间。

再一次,我不确定你有什么特别的问题,但这可能会解决它,并比使用clr命名空间和程序集信息更好。只要确保提出一些独特的东西,以避免遇到xmlns冲突,或者您必须返回到clr/assembly命名空间。


哦,还有最后一件事...如果你想利用你的XML命名空间的命名方案版本(你应该),不担心自己锁定的向后兼容性。如果您更新外部程序集以映射到更新的xml名称空间,则始终可以利用XmlnsCompatibleWithAttribute确保使用旧的友好名称空间的代码不会中断。

例如,如果你原来有你组装指向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")] 
相关问题