我还写了相当多的 IValueConverters,而且绝对很容易过度使用它们。一种技术是移动逻辑并将其包装在您可以绑定到的更简单的属性中。
例如,在您提到的场景中,您可能会考虑将验证逻辑从转换器中移到业务对象中,例如您的Passenger 类。也许您可以在Passenger 上实现一个布尔IsValid 属性。然后,您可以将 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" />
然后转换器需要将其参数解析为布尔值,并在结果为假时翻转结果。