我遇到了附加属性的奇怪问题,当我在调用RegisterAttached时分配属性名称并正确命名附加属性的名称(比如TranslateProperty和“Translate”)附加属性的代码实施不起火。只是没有被召唤。如果我将字符串名称更改为除Translate之外的任何内容(例如“Translate_”),则代码被调用就好了。
以下是实施:
公共类TranslateExtension:DependencyObject {
public static readonly DependencyProperty TranslateProperty =
DependencyProperty.RegisterAttached("Translate_",
typeof(bool),
typeof(TranslateExtension),
new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender));
public static void SetTranslate(UIElement element, bool value)
{
AssignKeys(element);
element.SetValue(TranslateProperty, value);
}
public static bool GetTranslate(UIElement element)
{
return (bool)element.GetValue(TranslateProperty);
}
public bool Translate
{
set { base.SetValue( TranslateProperty, value); }
}
...
}
以上实际上是有效的,因为字符串中的属性是Translate_。如果我将字符串值更改为“Translate”则失败。
我在同一个类中有2个其他附加属性,它们表现出完全相同的行为 - 与AttachedProperty同名,并且它们不会被调用。将其命名为其他内容并且有效。
我不确定这里发生了什么。我的代码实际上是使用无效的名称,但我不明白为什么,更重要的是我不确定这个错误的命名是否会导致任何副作用。
有人能看出我是否忽略了一些非常明显的东西?我在AttachedProperties的文章中重新讨论了一些示例,我没有看到这些实现使用特殊名称 - 它们总是将字符串属性命名为附加属性。
答案 0 :(得分:2)
你不应该在你的SetTranslate中加入额外的代码,因为它不会被调用。来自MSDN here:
对自定义依赖项属性的影响
因为当前的WPF实现 的XAML处理器行为 属性设置绕过包装器 完全,你不应该放任何 集合中的附加逻辑 你的包装器的定义 自定义依赖属性。如果你放 那么在集合定义中就是这样的逻辑 当时,逻辑不会被执行 该属性设置在XAML中 而不是代码。
同样,XAML的其他方面 获取属性值的处理器 来自XAML处理也使用GetValue 而不是使用包装器。 因此,你也应该避免任何 get中的其他实现 GetValue调用之外的定义。
而是将PropertyChangedCallback添加到FrameworkPropertyMetadata。