我终于找到了一种方法来实现我的目标,使用Description
枚举值的属性和Converter
.
由于无法将资源文件中的值直接用作描述属性,因此我首先创建了自定义的 LocalizedDescriptionAttribute 类,该类继承自 DescriptionAttribute:
public class LocalizedDescriptionAttribute : DescriptionAttribute
{
public LocalizedDescriptionAttribute(string resourceId)
: base(GetStringFromResource(resourceId))
{ }
private static string GetStringFromResource(string resourceId)
{
return AppResources.ResourceManager.GetString(resourceId);
}
}
这样我就可以使用资源的 ID 作为 LocalizedDescription 属性:
public enum Pet
{
[LocalizedDescription("Dog")]
Dog,
[LocalizedDescription("Cat")]
Cat,
[LocalizedDescription("Platypus")]
Platypus
}
在这里,我创建了一个ValueConverter
在我的 ListPicker 中以适当语言显示字符串的工作:
public class EnumToStringConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value != null)
{
Type type = value.GetType();
string name = Enum.GetName(type, value);
if (name != null)
{
FieldInfo field = type.GetField(name);
if (field != null)
{
DescriptionAttribute attr =
Attribute.GetCustomAttribute(field,
typeof(DescriptionAttribute)) as DescriptionAttribute;
if (attr != null)
{
return attr.Description;
}
}
}
}
return null;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
完成此操作后,我DataTemplate
为 ListPicker 项目创建了一个,通过 a 设置 TextBlock 的 Text 属性的值Binding
并使用Converter
:
<DataTemplate x:Key="ListPickerDataTemplate">
<Grid>
<TextBlock Text="{Binding Converter={StaticResource EnumToStringConverter}}"/>
</Grid>
</DataTemplate>
我以与之前相同的方式填充 ListPicker:
PetListPicker.ItemsSource = Enum.GetValues(typeof(Pet));
现在我的 ListPicker 显示了项目的本地化值,优点是SelectecItem
ListPicker 的属性可以绑定到 Enum 类型的属性。
例如,如果我的 ViewModel 中有以下属性,我想在其中存储所选项目:
public Pet MyPet {get; set;};
我可以只使用绑定:
<toolkit:ListPicker x:Name="MyListPicker" SelectedItem="{Binding MyPet, Mode=TwoWay}" ItemTemplate="{StaticResource ListPickerDataTemplate}"/>