2011-03-25 57 views
1

在我編寫我的WPF和Silverlight應用程序時,有一件事開始困擾着我,它似乎需要編寫幾個ValueConverters來完成綁定。許多轉換器正在處理事情,OK按鈕的IsEnabled綁定,例如:如何處理XAML valueconverter類爆炸

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

其看來,雖然,我與十幾轉換結束了處理每一個有一點點不同的轉換情況。難道我做錯了什麼?我應該嘗試將類似的轉換器轉換爲一個轉換器類嗎?其他人做什麼?隨着轉換器數量的增加,誘惑力也會加大,並且在事件處理程序後面的代碼中執行某些啓用/禁用等。

回答

1

我也寫了相當數量的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" /> 

然後轉換器將需要它的參數解析爲布爾和翻轉結果是錯誤的。

+0

我已經開始將我的邏輯移出到域類上 - 因爲新屬性與其數據相關聯,因此更清晰。更容易測試! – Calanus 2011-03-28 09:32:47