DependencyProperty Converter On UserControl - PullRequest
0 голосов
/ 03 мая 2011

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

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

ОК, отлично, поэтому при использовании его в XAML я могу легко привязать к указанному свойству обычное значение типа double, например:

<local:FormList TitleWidth="100">

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

<local:FormList TitleWidth="Auto">

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

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

Любые идеи или информация о том, где можно получить дополнительную информацию?

Ответы [ 2 ]

2 голосов
/ 03 мая 2011

Идет преобразование значения по умолчанию:

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

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

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

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

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

От MSDN

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

0 голосов
/ 03 мая 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...