Я также написал довольно много 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" />
Тогда преобразователь должен был бы проанализировать свой параметр для логического значения и перевернутьрезультат, когда он ложный.