Wpf MC3074-类型在“中不存在”;clr名称空间…“;
我在从其他程序集中引用xaml中的类时遇到问题 在同一个解决方案中,我有两个项目。一个称为控件(保存用户控件),另一个称为数据绑定(保存转换器/验证规则)。在控件中,我尝试引用xaml中的验证规则:Wpf MC3074-类型在“中不存在”;clr名称空间…“;,wpf,data-binding,reference,Wpf,Data Binding,Reference,我在从其他程序集中引用xaml中的类时遇到问题 在同一个解决方案中,我有两个项目。一个称为控件(保存用户控件),另一个称为数据绑定(保存转换器/验证规则)。在控件中,我尝试引用xaml中的验证规则: <Binding.ValidationRules> <databind:Validators.FileExistsRule /> </Binding.ValidationRules> 但是,当我编译时,我得到一个错误: The tag 'Validator
<Binding.ValidationRules>
<databind:Validators.FileExistsRule />
</Binding.ValidationRules>
但是,当我编译时,我得到一个错误:
The tag 'Validators.FileExistsRule' does not exist in XML namespace 'clr-namespace:GuiParts.DataBinding;assembly=DataBinding'.
这个类肯定存在,我可以在代码中调用它,没有问题,但不能通过xaml。如果我将类移动到同一个项目,同样,我没有问题。我在这里看到了其他问题,并尝试了以下方法:
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;
}
}
}
所以我的名字空间等都是正确的
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")]