RegisterAttached String PropertyName, в результате чего AttachedProperty не срабатывает
-
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.