また、かなりの数の IValueConverters を作成しましたが、それらを過度に使用するのは間違いなく簡単です。1 つの手法は、ロジックを移動し、バインドできるより単純なプロパティにラップすることです。
たとえば、あなたが言及したシナリオでは、検証ロジックをコンバーターからビジネス オブジェクト (Passenger クラスなど) に移動することを検討できます。Passenger にブール値の IsValid プロパティを実装することもできます。次に、IsEnabled を直接バインドするか、ボタンの Command プロパティを、IsValid に接続された CanExecute プロパティを持つ ICommand にバインドします。
一般に、コンバーターの数を減らすのに役立つ別の手法は、ConverterParameter を使用することです。たとえば、true を Visibility.Visible に変換し、false を Visibility.Collapsed に変換できるコンバーターが必要であり、その逆 (true を Collapsed に、false を Visible に変換) を行うコンバーターも必要だとします。
これは、2 つのコンバーターで行うことができます。
<TextBlock Visibility="{Binding MyBoolean, Converter={StaticResource BoolToVisibilityConverter}" />
<TextBlock Visibility="{Binding MyBoolean, Converter={StaticResource InvertedBoolToVisibilityConverter}" />
または、1 つのコンバーターでそれを行うこともできます。
<TextBlock Visibility="{Binding MyBoolean, Converter={StaticResource BoolToVisibilityConverter}, ConverterParameter=true" />
<TextBlock Visibility="{Binding MyBoolean, Converter={StaticResource BoolToVisibilityConverter}, ConverterParameter=false" />
次に、コンバーターはパラメーターをブール値に解析し、false の場合は結果を反転する必要があります。