Преобразователь зависимостей свойств на UserControl

#c# #wpf #dependency-properties #default-value

#c# #wpf #свойства зависимости #значение по умолчанию

Вопрос:

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

 public static readonly DependencyProperty TitleWidthProperty = DependencyProperty.Register("TitleWidth", typeof(double), typeof(FormList));
  

Хорошо, отлично, поэтому при использовании его в XAML я могу легко привязаться к указанному свойству, используя обычное значение ‘double’, например;

 <local:FormList TitleWidth="100">
  

Потрясающе! Именно то, что я хочу, работает как мечта. Тем не менее, я хочу попробовать что-то более умное и сказать; (очевидно, что какой-то другой код будет определять ширину)

 <local:FormList TitleWidth="Auto">
  

Но независимо от того, что я делаю со свойством dependency, все, что я когда-либо получаю, это FormatException в конструкторе, потому что «Auto» — это строка, а не double. Я пробовал всевозможные комбинации обратных вызовов PropertyMetadata, ValueCorercion и ValidateValue безрезультатно. Я знаю, что есть способ сделать это, потому что он работает для некоторых встроенных элементов управления, например;

 <!-- 'Red is a color and not a 'Brush' so there is some conversion happening here.-->
<Border Background="Red"/>
  

Есть идеи или информация о том, где получить дополнительную информацию?

Ответ №1:

Происходит преобразование значений по умолчанию:

Строковое значение, содержащееся в открывающих и закрывающих кавычках, обрабатывается процессором XAML. Для свойств поведение обработки по умолчанию определяется типом базового свойства CLR.

Значение атрибута заполняется одним из следующих способов, используя этот порядок обработки:

  1. Если процессор XAML обнаруживает фигурную скобку или элемент object, который является производным от MarkupExtension, то сначала вычисляется указанное расширение разметки, а не обрабатывается значение в виде строки, и в качестве значения используется объект, возвращаемый расширением разметки. Во многих случаях объект, возвращаемый расширением разметки, будет ссылкой на существующий объект или выражением, которое откладывает вычисление до времени выполнения, и не является вновь созданным объектом.

  2. Если свойство объявлено с помощью attributed TypeConverter или тип значения этого свойства объявлен с помощью attributed TypeConverter, строковое значение атрибута передается преобразователю типов в качестве входных данных преобразования, и преобразователь вернет новый экземпляр объекта.

  3. Если нет преобразователя типов, предпринимается попытка прямого преобразования в тип свойства. Этот последний уровень представляет собой прямое преобразование собственного значения синтаксического анализатора между примитивными типами языка XAML или проверку имен именованных констант в перечислении (затем анализатор получает доступ к соответствующим значениям).

Из MSDN

Вы можете создать TypeConverter, который должен обрабатывать строку так, как вы хотите. (например, как с некоторыми элементами управления WPF, которые превращаются Auto в double.NaN )

Ответ №2:

Вместо double вам нужен тип, который поддерживает концепцию автоматического размера, например GridLength . Тогда, конечно, ваш элемент управления должен передать это значение чему-то, что знает, что с ним делать (например, Grid ), или вам нужно самостоятельно закодировать эту логику.

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

1. Ваш ответ немного расплывчатый. Что вы имеете в виду под «передать … на что-то», что такое «что-то»? Кроме того, в моем примере с цветом ‘Brush’ не поддерживает назначение цвета, поэтому я думаю, что это реальный ответ, который я ищу.