实现绑定TemplateBinding的DependencyProperty时出现XDG0008错误如何解决
这个错误由多个常见的XAML和附加属性编写问题共同导致,具体原因和修复方案如下:
错误原因汇总
- 附加属性注册方法使用错误:你当前用
DependencyProperty.Register注册的是普通依赖属性,要作用于其他控件的附加属性必须用DependencyProperty.RegisterAttached方法注册。 - 依赖属性所有者类型填写错误:注册方法的第三个参数是该属性的所有者类,应该填定义属性的
typeof(ExtensionsClass),而非typeof(Button),这会直接导致XAML找不到对应类的属性定义。 - 拼写不一致:报错提示找不到
ExtensionClass,但你实际定义的类名为ExtensionsClass(多了s);如果有地方将命名空间写为小写extensions,和定义的首字母大写的Extensions不匹配,也会触发命名空间找不到的错误。 - TemplateBinding绑定附加属性语法错误:绑定附加属性时需要用括号包裹完整的属性路径,否则XAML会将其识别为普通控件属性,无法正确关联到扩展类的附加属性。
修复后的代码
C#代码修正
namespace Extensions { public class ExtensionsClass { // 改用RegisterAttached注册附加属性,所有者类型改为当前类 public static readonly DependencyProperty MouseOverBackgroundProperty = DependencyProperty.RegisterAttached( "MouseOverBackground", typeof(Brush), typeof(ExtensionsClass), new PropertyMetadata(null)); public static void SetMouseOverBackground(UIElement element, Brush value) { element.SetValue(MouseOverBackgroundProperty, value); } public static Brush GetMouseOverBackground(UIElement element) { return (Brush)element.GetValue(MouseOverBackgroundProperty); } } }
XAML代码修正
<ResourceDictionary xmlns:ext="clr-namespace:Extensions" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero2" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"> <ControlTemplate x:Key="ButtonBaseControlTemplate1" TargetType="{x:Type ButtonBase}"> <!-- 补上原代码缺失的border元素避免运行时报错 --> <Border x:Name="border" Background="{TemplateBinding Background}"> <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/> </Border> <ControlTemplate.Triggers> <Trigger Property="IsMouseOver" Value="True"> <!-- 附加属性用括号包裹,修正绑定语法 --> <Setter Property="Background" TargetName="border" Value="{TemplateBinding Property=(ext:ExtensionsClass.MouseOverBackground)}"/> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </ResourceDictionary>
额外注意事项
- 如果
ExtensionsClass定义在单独的类库项目中,XAML的命名空间需要加上程序集声明,格式为clr-namespace:Extensions;assembly=你的类库程序集名称 - 修复后如果仍有设计时报错,尝试清理解决方案、重新生成项目后重启Visual Studio即可消除设计时缓存导致的误报。
内容的提问来源于stack exchange,提问作者snailatspace
相关产品推荐
相关产品推荐

