我无法从其他程序集中引用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。如果我将课程移到同一个项目,我再也没有问题。我在这里看到了其他问题,并尝试了以下内容:
以上都没有奏效。关于我哪里出错的任何建议?
修改
我的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 :(得分:4)
试试这个:
xmlns:databind="clr-namespace:GuiParts.DataBinding.Validators;assembly=DataBinding"
<Binding.ValidationRules>
<databind:FileExistsRule />
</Binding.ValidationRules>
答案 1 :(得分:2)
答案 2 :(得分:2)
虽然我不确定您遇到的问题是什么,但您也可以为程序集和CLR命名空间创建更友好的命名空间定义。实际上,我使用这种技术将各种命名空间分组到一个XML命名空间中...您可以使用XmlnsPrefixAttribute
和XmlnsDefinitionAttribute
来执行此操作。
例如:
[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")]