我正在尝试在网格控件上注册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>
之前有没有人遇到过这种奇怪的行为?在我的案例中我错过了什么?在此先感谢您的回复!
答案 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;
}