Я пытаюсь получить свое представление на разных языках, используя файл 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 в качестве индекса?
После нескольких часов веб-поиска я наконец нашел решение с помощью конвертера, это может быть не лучшая практика для решения проблемы, но по крайней мере она делает именно то, что я хочу:
Мой конвертер:
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}}" />
Благодарю.
Можете ли вы сделать что-то вроде:
public class City
{
public int Id { get; set; }
public string LocalizationKey { get; set; }
public City(string englishName)
{
LocalizationKey = Properties.Resources.ResourceManager.GetString(englishName);
}
}
Я не уверен в этой лучшей практике; но это то, что приходило на ум первым.