WPF: Создание прикрепленного связываемого свойства

#c# #wpf

#c# #wpf

Вопрос:

Я пытаюсь добавить свойство, которое может быть прикреплено к любому элементу управления и привязать к нему значение.

 public class ValidationBorder : DependencyObject
    {
        public static readonly DependencyProperty HasErrorProperty =
            DependencyProperty.Register(
                "HasError",
                typeof(bool?),
                typeof(UIElement),
                new PropertyMetadata(default(Boolean))
            );

        public bool? HasError
        {
            get { return (bool?) GetValue(HasErrorProperty); }
            set {  SetValue(HasErrorProperty, value);}
        }

        public static void SetHasError(UIElement element, Boolean value)
        {
            element.SetValue(HasErrorProperty, value);
        }
        public static Boolean GetHasError(UIElement element)
        {
            return (Boolean)element.GetValue(HasErrorProperty);
        }
    }
  

Мое использование:

 <TextBox Text="{Binding SelectedFrequencyManual, UpdateSourceTrigger=PropertyChanged}" TextAlignment="Center"
                         attached:ValidationBorder.HasError="{Binding Path=DataOutOfRange}">
                </TextBox>
  

Когда я запускаю проект, он отображает ошибку (переведено):

Привязка не может быть указана в свойстве setHasError текстового поля. В DependencyProperty объекта DependencyObject может быть указана только привязка

Что с этим может быть не так?

Я перепробовал все, что смог найти в Интернете:

  • Добавьте скобки в привязку
  • Добавить RelativeSource
  • Изменить DependencyProperty.Register на DependencyProperty.RegisterAttached
  • Различные типы для typeof(UIElement) , включая typeof(TextBox)

Комментарии:

1. typeof(UIElement) неверно, это должно быть typeof(ValidationBorder)

2. Для прикрепленного свойства вы действительно RegisterAttached() используете метод .

Ответ №1:

Попробуйте эту реализацию:

 public class ValidationBorder
{
    public static readonly DependencyProperty HasErrorProperty =
        DependencyProperty.RegisterAttached(
            "HasError",
            typeof(bool?),
            typeof(ValidationBorder),
            new PropertyMetadata(default(bool?))
        );

    public static void SetHasError(UIElement element, bool? value)
    {
        element.SetValue(HasErrorProperty, value);
    }
    public static bool? GetHasError(UIElement element)
    {
        return (bool?)element.GetValue(HasErrorProperty);
    }
}
  

Вы должны вызвать RegisterAttached и установить тип владельца на ValidationBorder . Также удалите HasError свойство. Пожалуйста, обратитесь к документам для получения дополнительной информации.