RegisterAttached String PropertyName导致AttachedProperty无法触发

时间:2009-06-17 08:26:25

标签: wpf attached-properties

我遇到了附加属性的奇怪问题,当我在调用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的文章中重新讨论了一些示例,我没有看到这些实现使用特殊名称 - 它们总是将字符串属性命名为附加属性。

1 个答案:

答案 0 :(得分:2)

你不应该在你的SetTranslate中加入额外的代码,因为它不会被调用。来自MSDN here

  

对自定义依赖项属性的影响

     

因为当前的WPF实现   的XAML处理器行为   属性设置绕过包装器   完全,你不应该放任何   集合中的附加逻辑   你的包装器的定义   自定义依赖属性。如果你放   那么在集合定义中就是这样的逻辑   当时,逻辑不会被执行   该属性设置在XAML中   而不是代码。

     

同样,XAML的其他方面   获取属性值的处理器   来自XAML处理也使用GetValue   而不是使用包装器。   因此,你也应该避免任何   get中的其他实现   GetValue调用之外的定义。

而是将PropertyChangedCallback添加到FrameworkPropertyMetadata。