1

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

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

似乎我最终得到了十几个转换器来处理每一个稍微不同的转换情况。难道我做错了什么?我应该尝试将类似的转换器整合到一个转换器类中吗?其他人做什么?随着转换器数量的增加,在事件处理程序后面的旧代码中投入毛巾并执行一些启用/禁用等的诱惑也在增加。

4

1 回答 1

1

我还写了相当多的 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" />

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

于 2011-03-25T14:15:45.517 回答