Как бороться с взрывом класса XAML valueconverter - PullRequest
1 голос
/ 25 марта 2011

Когда я пишу свои приложения WPF и Silverlight, одна вещь, которая начинает меня беспокоить, это огромное количество ValueConverters, которые мне, кажется, нужно написать, чтобы выполнить связывание. Многие из преобразователей обрабатывают такие вещи, как привязки IsEnabled кнопки OK, например ::10000

 <Button x:Name="OKButton" Content="OK" IsEnabled="{Binding SelectedItem, ElementName=acbPassenger, Converter={StaticResource ValidPassengerConverter}}"/>

Похоже, что я заканчиваю с дюжиной конвертеров, чтобы справиться с каждой немного другой конверсионной ситуацией. Я делаю что-то неправильно? Стоит ли пытаться свернуть похожие конвертеры в один класс конвертеров? Что делают другие люди? По мере увеличения числа конвертеров увеличивается и искушение бросить полотенце и сделать некоторые из включений / отключений и т. Д. В старом коде за обработчиком событий.

1 Ответ

1 голос
/ 25 марта 2011

Я также написал довольно много IValueConverters, и их легко переусердствовать.Один из методов - переместить логику и обернуть ее в более простое свойство, с которым вы можете связать.

Например, в упомянутом сценарии вы могли бы рассмотреть возможность перемещения логики проверки из преобразователей в бизнес-объекты.Например, ваш пассажирский класс.Возможно, вы могли бы реализовать логическое свойство IsValid в Passenger.Затем вы можете либо привязать IsEnabled непосредственно к нему, либо привязать свойство Command кнопки к ICommand, свойство CanExecute которого связано с IsValid.

В общем, другой метод, который может помочь сократить количество преобразователей, заключается виспользуя ConverterParameter.Например, предположим, что вам нужен конвертер, который может преобразовать true в Visibility.Visible и false в Visibility.Collapsed, а также вам нужен конвертер, который будет выполнять обратное действие (true для Collapsed и false в Visible).

Вы могли бы сделать это с двумя конвертерами:

<TextBlock Visibility="{Binding MyBoolean, Converter={StaticResource BoolToVisibilityConverter}" />
<TextBlock Visibility="{Binding MyBoolean, Converter={StaticResource InvertedBoolToVisibilityConverter}" />

Или вы могли бы сделать это с одним конвертером:

<TextBlock Visibility="{Binding MyBoolean, Converter={StaticResource BoolToVisibilityConverter}, ConverterParameter=true" />
<TextBlock Visibility="{Binding MyBoolean, Converter={StaticResource BoolToVisibilityConverter}, ConverterParameter=false" />

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

...