WPF: альтернативный способ указать ValueConverter на привязку - PullRequest
2 голосов
/ 04 июня 2009

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

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

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

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

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

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

Редактировать: Другой способ - превратить конвертер в расширение так что вы указываете конвертер, используя формат расширения разметки:

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

Ответы [ 2 ]

2 голосов
/ 04 июня 2009

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

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

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

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

0 голосов
/ 04 июня 2009

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

...