Привязать строку из .resx ResourceDictionary к TextBlock.Text, используя ключ индекса

1

Я пытаюсь получить свое представление на разных языках, используя файл Properties/Resources.resx для локализации.

Моя модель выглядит следующим образом:

class City 
{
    public int Id { get; set; }
    public string LocalizationKey { get; set; }
}

ViewModel:

class ViewModel
{
    public ObservableCollection<City> Cities { get; set; }
}

И в моем представлении у меня есть следующий код:

<ItemsControl ItemsSource="{Binding Cities}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding LocalizationKey}" />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

Когда я хочу получить значение моего строкового ключа из словаря только для одного элемента без коллекции элементов, он работает правильно, используя следующий код:

<TextBlock Text="{x:Static properties:Resources.MyStringKey}" />

Проблема заключается в использовании вышеприведенного кода с элементом ItemsControl, где ключи неизвестны! Есть ли способ получить доступ к значениям словаря, используя LocalizationKey в качестве индекса?

Теги:
xaml
wpf
localization
resx

2 ответа

1
Лучший ответ

После нескольких часов веб-поиска я наконец нашел решение с помощью конвертера, это может быть не лучшая практика для решения проблемы, но по крайней мере она делает именно то, что я хочу:

Мой конвертер:

public class LocalizationConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var key = value as string;
        if (!string.IsNullOrEmpty(key))
        {
            string dictionaryValue = Resources.ResourceManager.GetString(key);
            return dictionaryValue ?? key;
        }
        return value;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

и код XAML:

<TextBlock Text="{Binding LocalizationId, Converter={StaticResource LocalizationConverter}}" />

Благодарю.

1

Можете ли вы сделать что-то вроде:

public class City
{
    public int Id { get; set; }
    public string LocalizationKey { get; set; }
    public City(string englishName)
    {
        LocalizationKey = Properties.Resources.ResourceManager.GetString(englishName);
    }
}

Я не уверен в этой лучшей практике; но это то, что приходило на ум первым.

  • 0
    Это может работать, но в модели нет конструктора с параметром CityName, на самом деле это всего лишь пример для моделирования проблемы, все значения хранятся в файлах ресурсов resx (Resources.resx, Resources.fr-FR.resx ...)
  • 0
    @cYounes, вы устанавливаете Id в какой-то момент и хотите использовать Id для извлечения строки из ресурсов и установки LocalizationKey?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню