В чем разница между TypeConverters и MarkupExtension в WPF - PullRequest
7 голосов
/ 05 июля 2011

В чем разница между TypeConverters и MarkupExtension?

Ответы [ 2 ]

7 голосов
/ 05 июля 2011

TypeConverter используются для неявного преобразования одного типа в другой. Например, BrushConverter может преобразовать строку "Red" в SolidColorBrush, для свойства Color которого установлено значение red. Как и в этом случае:

<Button Background="Red" />

MarkupExtension позволяет вам предоставлять более настраиваемые значения свойств. Есть также несколько специальных расширений разметки, Binding, MultiBinding и DynamicResource. Они обеспечивают не только статическое значение, но и более динамическое значение.

Таким образом, вы можете создавать расширения разметки, которые выполняют те же операции, что и преобразователи типов, но тогда вам придется явно использовать их, в отличие от неявной природы преобразователей типов.

1 голос
/ 06 июля 2011

A TypeConverter предназначен для преобразования из одного типа в другой. Существует несколько стандартных функций, таких как BrushConverter , ColorConverter , BooleanConverter и так далее. Смотрите здесь для полного списка. Что хорошо в преобразователях типов, так это то, что их можно применять к определению свойства, используя следующее определение атрибута в определении класса ...

[TypeConverterAttribute(typeof(BrushConverter)]
public Brush Background
{
   ...
}

... реализация BrushConverter знает, что, если он получает строку в качестве входных данных, он должен попытаться преобразовать ее в известный экземпляр SolidBrush цвета. Это означает, что вашему XAML не нужно назначать фактическую ссылку SolidBrushes.Red на свойство, а вместо этого использовать простую строку ...

<Button Background="Red" />

... это гораздо быстрее написать и понять. Однако TypeConverter ВСЕГДА вызывается для назначения свойства, и вы не можете запретить XAML вызывать TypeConverter для вызова.

A MarkupExtension используется для возврата объекта, который затем назначается указанному свойству. Это более гибко, потому что вы можете решить, когда и где использовать MarkupExtension, и вы не ограничены определенными свойствами, которые были предварительно помечены атрибутом. Примерами расширений разметки являются Binding, StaticResource и DynamicResource.

Таким образом, преобразователь типов отлично подходит для определенных свойств определенного типа, для которого вы хотите принять больший диапазон значений, чем определяет сам тип. Расширение разметки отлично подходит для более общего использования, когда разработчик решает, когда и где его использовать

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