Локализация в базе данных ComboBox работает неправильно - PullRequest
1 голос
/ 26 сентября 2011

Я хочу перевести элементы моего поля со списком.Поэтому я использую персонализированный конвертер KeyToTranslationConverter, который преобразует значение Enum в переведенную строку.

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

Мое поле со списком привязано к наблюдаемой коллекции LanguagesEntries, а 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();

Все коллекции элементов переведены, кроме выбранного элемента, который дублируется:

Например,выбранный пункт «Английский» не переведен, но слово «английский» находится в списке со списком.

Может кто-нибудь мне помочь.

Арно.

1 Ответ

1 голос
/ 04 декабря 2013

У меня была именно эта проблема, я решил ее, привязав конвертер к источнику элементов вместо шаблона элемента.

<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.

...