Wpf MC3074-类型在“中不存在”;clr名称空间…“;

Wpf MC3074-类型在“中不存在”;clr名称空间…“;,wpf,data-binding,reference,Wpf,Data Binding,Reference,我在从其他程序集中引用xaml中的类时遇到问题 在同一个解决方案中,我有两个项目。一个称为控件(保存用户控件),另一个称为数据绑定(保存转换器/验证规则)。在控件中,我尝试引用xaml中的验证规则: <Binding.ValidationRules> <databind:Validators.FileExistsRule /> </Binding.ValidationRules> 但是,当我编译时,我得到一个错误: The tag 'Validator

我在从其他程序集中引用xaml中的类时遇到问题

在同一个解决方案中,我有两个项目。一个称为控件(保存用户控件),另一个称为数据绑定(保存转换器/验证规则)。在控件中,我尝试引用xaml中的验证规则:

<Binding.ValidationRules>
   <databind:Validators.FileExistsRule />
</Binding.ValidationRules>
但是,当我编译时,我得到一个错误:

The tag 'Validators.FileExistsRule' does not exist in XML namespace 'clr-namespace:GuiParts.DataBinding;assembly=DataBinding'.
这个类肯定存在,我可以在代码中调用它,没有问题,但不能通过xaml。如果我将类移动到同一个项目,同样,我没有问题。我在这里看到了其他问题,并尝试了以下方法:

  • 清理和重建所有相关项目
  • 确保所有项目都针对相同版本的.Net(4.0,完整配置文件)
  • 正在从命名空间定义的结尾删除“程序集”定义
  • 上述措施都没有奏效。关于我哪里出了问题,有什么建议吗

    编辑

    我的文件验证程序:

    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;
          }
       }
    }
    
    所以我的名字空间等都是正确的

  • 目标程序集中的类是公共的吗
  • 验证程序中的字段是公共字段吗
  • 您的命名空间GuiParts.DataBinding是否正确
  • 试试这个:

    xmlns:databind="clr-namespace:GuiParts.DataBinding.Validators;assembly=DataBinding"
    
    <Binding.ValidationRules>    
        <databind:FileExistsRule />    
    </Binding.ValidationRules> 
    
    xmlns:databind=“clr命名空间:GuiParts.DataBinding.Validators;assembly=DataBinding”
    
    虽然我不确定您遇到的问题是什么,但您也可以为程序集和CLR命名空间创建更友好的命名空间定义。事实上,我使用这种技术将各种名称空间组合成一个XML名称空间。。。您可以使用和s来执行此操作

    例如:

    [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,但我确信它在VisualStudio中也能正常工作。如果您没有键入xmlns导入并尝试在名称空间中使用对象,那么当您去解析它时,它将自动使用具有指定前缀的更友好的命名名称空间。另外,它非常好,可以帮助您避免xml名称空间和clr名称空间之间存在1:1的关系,因为您可以将多个clr名称空间映射到单个xml名称空间中

    同样,我不确定您具体遇到的问题是什么,但这可能会解决它,并且比使用clr名称空间和程序集信息要好。只要确保想出一些独特的方法,这样就不会遇到xmlns冲突,否则就必须返回clr/程序集名称空间


    哦,还有最后一件事。。。如果您希望在xml名称空间命名方案中使用版本控制(您应该这样做),不要担心为了向后兼容而将自己锁定。如果更新外部程序集以映射到较新的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")]
    

    更详细的编辑问题这些问题在当时是必要的,因为问题的细节太少,这是唯一可以提供的建议。请考虑投票时,您的方法可以是一个1行语句:<代码>返回文件。存在((字符串)值)吗?new ValidationResult(false,“文件不存在”):new ValidationResult(true,null)+1这帮了我的忙,我需要指定程序集。
    xmlns:databind="http://my.xml.namespace.com/"
    
    // 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")]