WPF附加属性和绑定的奇怪行为

时间:2013-08-27 14:49:04

标签: c# wpf xaml

我正在尝试在网格控件上注册WPF附加属性,但是,我今天遇到了非常奇怪的行为:

public static class MyClass
{
    public static readonly DependencyProperty MyPropertyProperty =
        DependencyProperty.RegisterAttached("MyProperty", typeof(string),
        typeof(MyClass), null);

    public static string GetMyProperty(DependencyObject d)
    {
        return (string)d.GetValue(MyPropertyProperty);
    }

    public static void SetMyProperty(DependencyObject d, string value)
    {
        d.SetValue(MyPropertyProperty, value); //<-- set breakpoint here
    }
}

XAML:

<GridControl local:MyClass.MyProperty="My Name">
...
</GridControl>

当我这样写时,附属的setter永远不会被执行。和价值永远不会被设定。但我可以窥探网格,发现附加的属性附加了一个空值。

但是当我将附加的属性名称更改为:

    public static readonly DependencyProperty MyPropertyProperty =
        DependencyProperty.RegisterAttached("xxxMyProperty", typeof(string),
        typeof(MyClass), null);

即。使用MyProperty以外的其他名称。那么断点就可以了!和价值可以设定!

此外,当我将附加属性更改为:

    public static readonly DependencyProperty MyPropertyProperty =
        DependencyProperty.RegisterAttached("MyProperty", typeof(string),
        typeof(UIElement), null);

即。将所有者类型更改为UIElement,然后我也可以点击断点,只是想知道为什么?

但是,当我在XAML中设置绑定而不是字符串常量时,上面的每个案例都会出现A 'Binding' can only be set on a DependencyProperty of a DependencyObject

的异常

绑定XAML示例:

<GridControl local:MyClass.MyProperty="{Binding MyStringValue}">
...
</GridControl>

之前有没有人遇到过这种奇怪的行为?在我的案例中我错过了什么?在此先感谢您的回复!

1 个答案:

答案 0 :(得分:1)

如果您将SetMyProperty方法称为“setter”,那么您应该知道这些方法只是“帮助”方法供您使用。框架通常不使用这些方法。

但是,如果您想说您想知道值何时发生变化,那么还有另一种方法可以做到这一点。在属性声明中添加PropertyChangedCallback处理程序:

public static readonly DependencyProperty MyPropertyProperty =
    DependencyProperty.RegisterAttached("MyProperty", typeof(string), typeof(MyClass), 
    new UIPropertyMetadata(default(string.Empty), OnMyPropertyChanged));

public static void OnMyPropertyChanged(DependencyObject dependencyObject, 
    DependencyPropertyChangedEventArgs e)
{
    string myPropertyValue = e.NewValue as string;
}