#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.
Значение атрибута заполняется одним из следующих способов, используя этот порядок обработки:
Если процессор XAML обнаруживает фигурную скобку или элемент object, который является производным от MarkupExtension, то сначала вычисляется указанное расширение разметки, а не обрабатывается значение в виде строки, и в качестве значения используется объект, возвращаемый расширением разметки. Во многих случаях объект, возвращаемый расширением разметки, будет ссылкой на существующий объект или выражением, которое откладывает вычисление до времени выполнения, и не является вновь созданным объектом.
Если свойство объявлено с помощью attributed TypeConverter или тип значения этого свойства объявлен с помощью attributed TypeConverter, строковое значение атрибута передается преобразователю типов в качестве входных данных преобразования, и преобразователь вернет новый экземпляр объекта.
Если нет преобразователя типов, предпринимается попытка прямого преобразования в тип свойства. Этот последний уровень представляет собой прямое преобразование собственного значения синтаксического анализатора между примитивными типами языка XAML или проверку имен именованных констант в перечислении (затем анализатор получает доступ к соответствующим значениям).
Вы можете создать TypeConverter, который должен обрабатывать строку так, как вы хотите. (например, как с некоторыми элементами управления WPF, которые превращаются Auto
в double.NaN
)
Ответ №2:
Вместо double
вам нужен тип, который поддерживает концепцию автоматического размера, например GridLength
. Тогда, конечно, ваш элемент управления должен передать это значение чему-то, что знает, что с ним делать (например, Grid
), или вам нужно самостоятельно закодировать эту логику.
Комментарии:
1. Ваш ответ немного расплывчатый. Что вы имеете в виду под «передать … на что-то», что такое «что-то»? Кроме того, в моем примере с цветом ‘Brush’ не поддерживает назначение цвета, поэтому я думаю, что это реальный ответ, который я ищу.