我也寫了相當數量的IValueConverters,並且過度使用它們確實很容易。一種技術是移動邏輯並將其包裝在一個可綁定到的簡單屬性中。例如,在您提到的場景中,您可能會考慮將驗證邏輯移出轉換器並移入業務對象,例如,你的乘客艙。也許你可以在Passenger上實現一個布爾型的IsValid屬性。然後,您可以將IsEnabled直接綁定到它,或者將按鈕的Command屬性綁定到一個ICommand,其CanExecute屬性連接到IsValid。
通常,另一種可以幫助減少轉換器數量的技術是使用ConverterParameter。例如,假設您需要一個轉換器,可以將真實轉換爲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" />
然後轉換器將需要它的參數解析爲布爾和翻轉結果是錯誤的。
我已經開始將我的邏輯移出到域類上 - 因爲新屬性與其數據相關聯,因此更清晰。更容易測試! – Calanus 2011-03-28 09:32:47