将 DependencyProperty 实现到 TemplateBinding 时发生 XDG0008 错误 [重复]

Posted

技术标签:

【中文标题】将 DependencyProperty 实现到 TemplateBinding 时发生 XDG0008 错误 [重复]【英文标题】:XDG0008 error occuring while implementing DependencyProperty into TemplateBinding [duplicate] 【发布时间】:2021-09-25 20:47:48 【问题描述】:

为了在不直接更改模板的情况下轻松更改按钮的特定于模板的画笔,我决定创建一个将绑定到特定于模板的画笔的 DependencyProperty。这样,我可以像更改任何其他常规属性一样轻松更改此画笔。但是,在实现这个 DependencyProperty 之后,我遇到了一个错误:“名称“ExtensionClass”在命名空间“clr-namespace:extensions”中不存在。”是什么导致了这个错误?

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">
        <ControlTemplate.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="Background" TargetName="border" Value="TemplateBinding Property=ext:ExtensionsClass.MouseOverBackground"/>
            </Trigger>
        </ControlTemplate.Triggers>
    </ControlTemplate>
</ResourceDictionary>

C#:

namespace Extensions 
    public class ExtensionsClass 
        public static readonly DependencyProperty MouseOverBackgroundProperty = DependencyProperty.Register("MouseOverBackground", typeof(Brush), typeof(Button));

        public static void SetMouseOverBackground(UIElement element, Brush value) 
            element.SetValue(MouseOverBackgroundProperty, value);
        

        public static Brush GetMouseOverBackground(UIElement element) 
            return (Brush)element.GetValue(MouseOverBackgroundProperty);
        
    

【问题讨论】:

【参考方案1】:

除了重复问题的答案中涉及的绑定问题之外,您还必须注意您正在声明一个attached property,它必须使用RegisterAttached 方法注册。

此外,在 Register 和 RegisterAttached 方法中,第三个参数必须是声明属性的类型,而不是您打算设置属性的元素类型,即此处为 typeof(ExtensionsClass)

public static class ExtensionsClass

    public static readonly DependencyProperty MouseOverBackgroundProperty =
        DependencyProperty.RegisterAttached(
             "MouseOverBackground",
             typeof(Brush), 
             typeof(ExtensionsClass),
             null);

    public static void SetMouseOverBackground(UIElement element, Brush value)
    
        element.SetValue(MouseOverBackgroundProperty, value);
    

    public static Brush GetMouseOverBackground(UIElement element)
    
        return (Brush)element.GetValue(MouseOverBackgroundProperty);
    

您通过带括号的绑定路径绑定到附加属性:

<Setter
    Property="Background"
    TargetName="border"
    Value="Binding Path=(ext:ExtensionsClass.MouseOverBackground),
            RelativeSource=RelativeSource TemplatedParent"/>
       

【讨论】:

1.为什么是附属财产? 2. Binding 不会比 TemplateBinding 慢吗? 常规依赖属性在派生自 DependencyObject 的类中声明,并且只能在声明该属性的类的实例或从该类派生的类上设置。 2.模板绑定不起作用。 你的意思是把它设置成一个样式?当然,就像任何其他属性一样:***.com/q/25595272/1136211

以上是关于将 DependencyProperty 实现到 TemplateBinding 时发生 XDG0008 错误 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

wpf c#通过DependencyProperty绑定两个视图模型不起作用

DependencyProperty 未在 PropertyChanged 上更新

将 ViewModel 的属性绑定到 UserControl 的子控件和自身的 DependencyProperty

如何使 Binding 尊重 DependencyProperty 值强制?

试图理解 DependencyProperty

实现 DependencyProperty 并避免“CA2104:不要声明只读可变引用类型”的最佳方法是啥?