2011-09-26 85 views
1

我想翻譯我的組合框的項目。 所以我使用個性化轉換器KeyToTranslationConverter將Enum值轉換爲翻譯後的字符串。數據綁定中的本地化ComboBox無法正常工作

[ValueConversion(typeof(object), typeof(string))] 
public class KeyToTranslationConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, 
            object parameter, CultureInfo culture) 
    { 
     return LocalizationResourcesManager.GetTranslatedText(value); 
    } 
} 

我的組合框綁定到observable集合上,語言條目和selectItem綁定到LanguageEntry屬性。

<ComboBox ItemsSource="{Binding LanguageEntries}" 
       SelectedItem="{Binding LanguageEntry}"> 
    <ComboBox.ItemTemplate> 
     <DataTemplate> 
      <Label Content="{Binding Converter={StaticResource Converter}}"/> 
     </DataTemplate> 
    </ComboBox.ItemTemplate> 
</ComboBox> 

我的問題是: 當用戶改變方法被稱爲語言:

CollectionViewSource.GetDefaultView(this.LanguageEntries).Refresh(); 

所有項目的集合被翻譯除了所選擇的項目被複制:

例如,選定的項目「Anglais」未翻譯,但英語單詞在組合框列表中。

有人可以幫助我。

Arnaud。

+0

簡單的解決方案:不是使用轉換器,而是在模型上公開一個LocalizedName屬性並綁定到該屬性。 – Will

+0

當然,您的解決方案的工作原理。我想使用轉換器,因爲我的視圖模型有很多枚舉集合,所以您的解決方案需要太多時間。如果不包含翻譯代碼,我認爲我的視圖模型更易於使用。 – BobyFish

+0

將SelectedItem屬性綁定到視圖模型的屬性,並在更改語言時刷新綁定的選定屬性。 – vorrtex

回答

1

我有這個確切的問題,我通過將轉換器綁定到itemssource而不是itemtemplate來解決它。

<ComboBox ItemsSource="{Binding LanguageEntries, Converter={StaticResource LanguageEntriesConverter}}"> 

而且轉換需要處理的集合,而不是每個項目:

public object Convert(object value, Type targetType, object parameter, string language) 
    { 
     if (value is System.Collections.ObjectModel.Collection<string>) 
     { 
      foreach (var c in (System.Collections.ObjectModel.Collection<string>)value) 
      { 
       c = LocalizationResourcesManager.GetTranslatedText(c); 
      } 
     } 
     return value; 
    } 

轉換器被稱爲每次無論是將分配給新的值或調用OnPropertyChanged更新您的ItemsSource時間。