2017-02-15 3 views
0

Hallo Ich habe ein Problem mit der Bindung von WPF und frage mich, ob das, was ich erreichen möchte, tatsächlich möglich ist.WPF - Complex Bindung von ComboBox

Ich habe eine ComboBox mit ItemsSource gebunden an X509FindType Enum mit dem ObjectDataProvider innerhalb eines Steuerelements, wie unten zu sehen.

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

Das Problem ist, dass ich ein Zwei-Wege-Bindung zwischen SelectedItem und Eigentum in meinem Modell machen muß, welche Art von String ist (ich kann es nicht ändern, dass bestimmte Enum-Typ zu sein).

Das Ziel scheint einfach zu sein - Immer wenn ich eine Zeichenkette in Model einstelle, sollte die ComboBox diesen Wert anzeigen. Auf der anderen Seite kann der Benutzer auch das Element aus ComboBox auswählen und der Wert der Zeichenfolge sollte auf den Namen dieses Aufzählungstyps aktualisiert werden.

Danke für irgendwelche Tipps und Entschuldigung für meine hässliche Englisch.

+0

Sie einen Konverter zwischen der konvertieren verwenden sollten Enum Wert und eine Zeichenfolge: https://www.codeproject.com/Tips/868163/IValueConverter-Example-und-Usage-in-WPF – mm8

Antwort

2

Sie sollten einen Konverter verwenden, um zwischen dem enum Wert und einem string zu konvertieren.

Bitte beachten Sie den folgenden Beispielcode.

Converter:

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(); 
    } 
} 

Ausblick:

<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}}" /> 

Ansicht Modell:

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

Funktioniert gut, danke mm8! – Kris82