MC3074 - “clr-namespace ...”中不存在类型

时间:2012-07-17 18:56:38

标签: wpf data-binding reference

我无法从其他程序集中引用xaml中的类。

在同一个解决方案中,我有两个项目。一个名为Controls(用于保存用户控件)和一个名为DataBinding(保存转换器/验证规则)。在控件中,我尝试在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. 从命名空间定义的末尾删除'assembly'定义。
  4. 以上都没有奏效。关于我哪里出错的任何建议?

    修改

    我的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();
    

    所以我的命名空间等也正确。

3 个答案:

答案 0 :(得分:4)

试试这个:

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

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

答案 1 :(得分:2)

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

答案 2 :(得分: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")]

然后,当您想在xaml中引用xmlnamespace时,您只需执行以下操作:

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

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

同样,我不确定你具体是什么问题,但这可能会解决它并且比使用clr命名空间和汇编信息更好。只要确保提出一些独特的东西,这样你就不会遇到xmlns碰撞,或者你必须回到clr / assembly命名空间。


哦,还有最后一件事......如果您希望在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")]