1

WPFアプリとSilverlightアプリを作成しているときに、気になり始めていることの1つは、バインディングを実行するために作成する必要があると思われるValueConverterの数です。コンバーターの多くは、OKボタンのIsEnabledバインディングなどを処理しています。

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

しかし、私は、これまでにないわずかに異なる変換状況を処理するために、1ダースほどのコンバーターになってしまうようです。私は何か間違ったことをしていますか?同様のコンバーターを1つのコンバータークラスにまとめようとする必要がありますか?他の人は何をしますか?コンバーターの数が増えると、タオルを投げ入れて、イベントハンドラーの背後にある古いコードで有効化/無効化などを実行したいという誘惑も高まります。

4

1 に答える 1

1

また、かなりの数の 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 の場合は結果を反転する必要があります。

于 2011-03-25T14:15:45.517 に答える