RegisterAttached String PropertyName, в результате чего AttachedProperty не срабатывает

StackOverflow https://stackoverflow.com/questions/1005773

  •  05-07-2019
  •  | 
  •  

Вопрос

Я столкнулся со странной проблемой с прикрепленными свойствами, когда при назначении имени свойства в вызове 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 и не вижу этих реализаций, использующих специальные имена - они всегда присваивают строковому свойству то же самое, что и вложенные свойства.

Это было полезно?

Решение

Вы не должны помещать дополнительный код в свой SetTranslate, так как он не будет вызван. Из MSDN здесь :

  

Последствия для пользовательских свойств зависимости

     

Потому что текущая реализация WPF   поведения процессора XAML для   установка свойства обходит обертки   целиком не стоит ставить   дополнительная логика в наборе   определения обертки для вашего   Свойство пользовательской зависимости. Если вы положите   такая логика в определении множества, то   логика не будет выполнена, когда   свойство установлено в XAML скорее   чем в коде.

     

Аналогичным образом, другие аспекты XAML   процессор, который получает значения свойств   из обработки XAML также использовать GetValue   вместо того, чтобы использовать обертку.   Поэтому вы также должны избегать любых   дополнительная реализация в получении   определение за пределами вызова GetValue.

Вместо этого добавьте PropertyChangedCallback в свой FrameworkPropertyMetadata.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top