2011-09-26 67 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时间。

相关问题