2014-01-29 3 views
2

У меня есть вопрос здесь, чтобы спросить. У меня есть перечисление, которое во время выполнения отображается в пользовательском интерфейсе. Он имеет три значения.Как преобразовать enum в локализованную структуру перечислений в WPF

enum ExpiryOptions 
{ 
    Never, 
    After, 
    On 
} 

Теперь пользователь userControl, когда он загружает свои показы Никогда, После, вкл.

<ComboBox x:Name="accessCombo" Margin="5" Height="25" Width="80" 
     ItemsSource="{Binding Source={StaticResource ResourceKey=expiryEnum}, 
     Converter={StaticResource enumtoLocalizeConverter}}"/> 

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

В преобразователе у меня написал код, как этот

 public object Convert(object value, Type targetType, 
        object parameter, CultureInfo culture) 
     { 
      ExpiryOption[] myEnum = value; // This myEnum is having all the enum options. 

     // Now what shall I write here 
     //if I write a code like this 
     if(myEnum[0] == Properties.Resources.Never) 
      return Properties.Resources.Never; 
     else if(myEnum[1] == Properties.Resources.After) 
      return Properties.Resources.After; 
     else if(myEnum[2] == Properties.Resources.On) 
      return Properties.Resources.On; 


     } 

то перечисление в пользовательском интерфейсе заполняется N E V E R (вертикально) В настройках английского языка. Очевидно, что первая строка соответствует и заполняется. Никогда еще нет двух других параметров. Любые предложения и помощь крайне необходимы.

+0

Я набивать перечисление в словаре. Ключ - это перечисление, а значение - строка, которую я хочу отобразить. – Paparazzi

ответ

0

Вам необходимо получить значение, переданное в ValueConverter, чтобы использовать его следующим образом.

[ValueConversion(typeof(ExpiryOptions), typeof(string))] 
public class MyEnumConverter: IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     ExpiryOptions option= 
      (ExpiryOptions)Enum.Parse(typeof(ExpiryOptions),value.ToString()); 

     // Now that you have the value of the option you can use the culture info 
     // to change the value as you wish and return the changed value. 
     return option.ToString();   
    } 
} 
1

Вы всегда возвращаются первое значение перечисления из преобразователя т.е. значения Never строки, которая является массив символов, следовательно, вы видите один элемент в качестве одного гольца в вашем ComboBox.

Вместо этого вы должны вернуть список строк:

List<string> descriptions = new List<string>(); 
foreach(ExpiryOption option in myEnum) 
{ 
    if(option == Properties.Resources.Never) 
     descriptions.Add(Properties.Resources.Never); 
    else if(option == Properties.Resources.After) 
     descriptions.Add(Properties.Resources.After); 
    else if(option == Properties.Resources.On) 
     descriptions.Add(Properties.Resources.On); 
} 
return descriptions; 
0

Предполагая, что строки вы определили ресурсы для Never, After, On как строки в классе Properties в ExpiryOptionsNever, ExpiryOptionsAfter, ExpiryOptionsOn соответственно (конечно со строками вам нужно) я бы написал этот конвертер:

public class EnumConverter: IValueConverter{ 
    public Dictionary<ExpiryOptions, string> localizedValues = new Dictionary<ExpiryOptions, string>(); 

    public EnumConverter(){ 
     foreach(ExpiryOptionsvalue in Enum.GetValues(typeof(ExpiryOptions))) 
     { 
      var localizedResources = typeof(Resources).GetProperties(BindingFlags.Static).Where(p=>p.Name.StartsWith("ExpiryOptions")); 
      string localizedString = localizedResources.Single(p=>p.Name="ExpiryOptions"+value).GetValue(null, null) as string; 
      localizedValues.Add(value, localizedString); 
     } 
    } 
    public void Convert(...){ 
     return localizedValues[(ExpiryOptions)value]; 
    } 
} 

Это, по существу, что пользователь Blam предложил в комментариях

Смежные вопросы