1

我遇到了附加属性的一个奇怪问题,当我在调用 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_,因此上述内容实际上有效。如果我将字符串值更改为“翻译”,它会失败。

我在同一个类中有 2 个其他附加属性,它们表现出完全相同的行为 - 与 AttachedProperty 名称相同,它们不会被调用。将其命名为其他名称,它就可以工作。

我不确定这里发生了什么。我的代码实际上是在使用无效的名称,但我不明白为什么,更重要的是我不确定这个错误的命名是否会导致任何副作用。

谁能看到我是否忽略了一些非常明显的东西?我在 AttachedProperties 的文章中重新审视了一些示例,但我没有看到那些使用特殊名称的实现——它们总是将字符串属性命名为与附加属性相同的名称。

4

1 回答 1

2

您不应该在 SetTranslate 中添加额外的代码,因为它不会被调用。从这里的MSDN :

自定义依赖属性的含义

由于用于属性设置的 XAML 处理器行为的当前 WPF 实现完全绕过包装器,因此不应将任何其他逻辑放入自定义依赖项属性的包装器的集合定义中。如果您将此类逻辑放在集合定义中,那么当在 XAML 中而不是在代码中设置属性时,将不会执行该逻辑。

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

相反,将 PropertyChangedCallback 添加到您的 FrameworkPropertyMetadata。

于 2009-06-17T16:03:09.783 回答