如何处理XAML valueconverter类爆炸

时间:2011-03-25 09:37:14

标签: xaml valueconverter

当我编写WPF和Silverlight应用程序时,开始困扰我的一件事是我似乎必须编写的ValueConverters数量来完成我的绑定。许多转换器正在处理诸如OK按钮IsEnabled绑定之类的东西,例如:

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

虽然看起来我最终会有十几个转换器来处理每一个如此略微不同的转换情况。难道我做错了什么?我是否应该尝试将类似的转换器转换为一个转换器类?其他人做什么?随着转换器数量的增加,在事件处理程序后面的代码中抛出毛巾并进行一些启用/禁用等的诱惑。

1 个答案:

答案 0 :(得分:1)

我也写过相当数量的IValueConverters,过度使用它们绝对容易。一种技术是移动逻辑并将其包装在您可以绑定的更简单的属性中。

例如,在您提到的方案中,您可以考虑将验证逻辑移出转换器并转移到业务对象中,例如你的乘客课程。也许你可以在Passenger上实现一个布尔的IsValid属性。然后你可以直接将IsEnabled绑定到它,或者将按钮的Command属性绑定到其CanExecute属性连接到IsValid的ICommand。

通常,另一种可以帮助减少转换器数量的技术是使用ConverterParameter。例如,假设您想要一个可以将true转换为Visibility.Visible和false的转换器转换为Visibility.Collapsed,并且您还需要一个反向转换器(转换为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" />

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