2009-06-03 3 views
2

Наиболее распространенный способ, с которым я столкнулся, указать преобразователь значений для привязки:
1. Создайте экземпляр преобразователя значений в качестве ресурса с ключом.
2. Ссылка экземпляр с помощью расширения разметки StaticResource:WPF: альтернативный способ указания ValueConverter при привязке

<TextBlock Text="{Binding Converter={StaticResource myFormatter}" /> 

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

<TextBlock Text="{Binding Path=Description, Converter={x:Static local:MyFormatter.Instance}}"/> 

// where Instance is declared as: 
public readonly static MyFormatter Instance = new MyFormatter(); 

В моем преобразователе случае значения неизменна.

Edit: другой путь to turn the converter into an extension так, что вы задаете преобразователь используя формат расширения разметки:

<TextBlock Text="{Binding Converter={local:MyFormatter}}"/> 
+0

Примечание: когда вы превращаете конвертер в расширение, объект создается каждый раз, когда к нему обращаются. – xmedeko

ответ

2

Технически это будет хорошо, но на практике я не люблю:

  1. Если вы объявляете преобразователь в качестве ресурса, то есть единая точка отсчета. Если вы измените пространство имен или имя класса конвертера, у вас будет только одно место для обновления.

  2. Если вы объявите его статичным, то вам нужно привести clr-namespace в верхней части каждого файла xaml, который использует конвертер. Если вы объявите его как ресурс, вы этого не сделаете.

  3. {Binding Converter={StaticResource myFormatter} намного короче и легче читать, чем статический. В конечном итоге это поможет вам больше, чем вы могли бы подумать.

+0

Предположим, что я использую конвертер только один раз (я действительно делаю), в этом случае объявление ресурса + ресурса ссылки будет более типичным. Но у вас есть точка. +1 –

+0

Уверен, но у вас, вероятно, будет более одного ValueConverter, и некоторые из этих других ValueConverters будут повторно использоваться (и поэтому вы хотите, чтобы они были ресурсами) ... и поэтому вы должны, вероятно, поставить это вместе с все остальные, так что это непротиворечиво :-) –

0

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

+0

Правильно, другое отличие состоит в том, что статический конструктор (инициализирующий статический экземпляр) будет вызываться при создании экземпляра класса, в то время как определяемый ресурсами конвертер происходит во время компоновки компонента WPF (грубо говоря). –

+0

Что вызывает страшную перспективу, что люди будут писать конвертеры с состоянием - я не хочу, чтобы EVER отлаживал такой код! Пред-кофе, я не могу представить себе оправдания. –

 Смежные вопросы

  • Нет связанных вопросов^_^