2017-02-15 2 views
0

Здравствуйте, у меня возникла проблема с привязкой WPF и задаюсь вопросом, действительно ли то, что я пытаюсь достичь, возможно.WPF - сложная привязка ComboBox

У меня есть ComboBox с ItemsSource, связанный с X509FindType Enum, используя ObjectDataProvider в элементе управления, как показано ниже.

<ObjectDataProvider x:Key="x509FindTypes" MethodName="GetValues" ObjectType="{x:Type System:Enum}"> 
    <ObjectDataProvider.MethodParameters> 
     <x:Type TypeName="cryptography:X509FindType" /> 
    </ObjectDataProvider.MethodParameters> 
</ObjectDataProvider> 

Проблема заключается в том, что мне нужно сделать двустороннюю привязку между SelectedItem и собственности в моей модели, которая является тип строки (я не могу изменить его в том, что определенный тип Enum).

Цель кажется простой: всякий раз, когда я устанавливаю строку в модели, ComboBox должен показывать это значение. С другой стороны, пользователь может также выбрать элемент из ComboBox, и значение строки должно быть обновлено до имени этого типа перечисления.

Спасибо за любые советы и извините за мой уродливый английский.

+0

Вы должны использовать конвертер для преобразования между значение перечисления и строка: https://www.codeproject.com/Tips/868163/IValueConverter-Example-and-Usage-in-WPF – mm8

ответ

2

Вы должны использовать преобразователь для преобразования между значением enum и string.

См. Следующий пример кода.

Преобразователь:

public class EnumToStringConv : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (value == null) 
      return value; 

     return (X509FindType)Enum.Parse(typeof(X509FindType), value.ToString(), true); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return ((X509FindType)value).ToString(); 
    } 
} 

Вид:

<ObjectDataProvider x:Key="x509FindTypes" MethodName="GetValues" ObjectType="{x:Type System:Enum}"> 
    <ObjectDataProvider.MethodParameters> 
     <x:Type TypeName="cryptography:X509FindType" /> 
    </ObjectDataProvider.MethodParameters> 
</ObjectDataProvider> 

<local:EnumToStringConv x:Key="EnumToStringConv" /> 
... 

<ComboBox SelectedItem="{Binding YourStringProperty, Converter={StaticResource EnumToStringConv}}" 
      ItemsSource="{Binding Source={StaticResource x509FindTypes}}" /> 

вид Модель:

private string _s = "FindByTimeExpired"; 
public string YourStringProperty 
{ 
    get { return _s; } 
    set { _s = value; } 
} 
+0

Отлично работает, спасибо mm8! – Kris82

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