如何处理XAML valueconverter类爆炸

如何处理XAML valueconverter类爆炸,xaml,valueconverter,Xaml,Valueconverter,在我编写WPF和Silverlight应用程序时,有一件事开始困扰我,那就是我似乎必须编写大量的ValueConverter来进行绑定。许多转换器正在处理OK按钮可启用绑定之类的事情,例如: <Button x:Name="OKButton" Content="OK" IsEnabled="{Binding SelectedItem, ElementName=acbPassenger, Converter={StaticResource ValidPassengerConverter}}

在我编写WPF和Silverlight应用程序时,有一件事开始困扰我,那就是我似乎必须编写大量的ValueConverter来进行绑定。许多转换器正在处理OK按钮可启用绑定之类的事情,例如:

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


似乎我最终会有十几个转换器来处理每一个稍微不同的转换情况。我做错什么了吗?我是否应该尝试将类似的转换器集成到一个转换器类中?其他人做什么?随着转换器数量的增加,在旧代码隐藏事件处理程序中放弃并执行一些启用/禁用等操作的诱惑也随之增加。

我还编写了大量的IValueConverters,显然很容易过度使用它们。一种技术是移动逻辑并将其封装在一个可以绑定到的更简单的属性中

例如,在您提到的场景中,您可能会考虑将验证逻辑从转换器中移入业务对象,例如您的乘客类。也许您可以在Passenger上实现一个布尔IsValid属性。然后,您可以将IsEnabled直接绑定到它,或者将按钮的Command属性绑定到ICommand,该ICommand的CanExecute属性连接到IsValid

通常,另一种有助于减少转换器数量的技术是使用ConverterParameter。例如,假设您需要一个可以将true转换为Visibility.Visible和false转换为Visibility.Collapsed的转换器,并且您还需要一个可以执行相反操作的转换器(true转换为Collapsed,false转换为Visibility.Collapsed)

您可以使用两个转换器执行此操作:

<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" />


然后转换器需要将其参数解析为布尔值,并在其为false时翻转结果。

我还编写了大量的IValueConverters,并且很容易过度使用它们。一种技术是移动逻辑并将其封装在一个可以绑定到的更简单的属性中

例如,在您提到的场景中,您可能会考虑将验证逻辑从转换器中移入业务对象,例如您的乘客类。也许您可以在Passenger上实现一个布尔IsValid属性。然后,您可以将IsEnabled直接绑定到它,或者将按钮的Command属性绑定到ICommand,该ICommand的CanExecute属性连接到IsValid

通常,另一种有助于减少转换器数量的技术是使用ConverterParameter。例如,假设您需要一个可以将true转换为Visibility.Visible和false转换为Visibility.Collapsed的转换器,并且您还需要一个可以执行相反操作的转换器(true转换为Collapsed,false转换为Visibility.Collapsed)

您可以使用两个转换器执行此操作:

<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" />


然后,转换器将需要将其参数解析为布尔值,并在其为false时翻转结果。

我已经开始将我的逻辑移到域类上,因为新属性与它们的数据相关联,因此更加清晰。更容易测试!我已经开始将我的逻辑转移到域类上——因为新属性与它们的数据关联,所以更加清晰。更容易测试!