2017-01-11 4 views
0

Ich versuche, eine Bindung für eine Combobox mit einer class property hinzuzufügen. Die Eigenschaft ist eine Aufzählung. Ich habe es geschafft, die Artikel von der enum auf die Combobox vielleicht ein wenig unorthodox zu laden, aber es funktioniert. (Verbesserungsvorschläge sind ebenfalls willkommen) Wenn dann das Formular geladen wird, zeigt das Combobox das aktive Geschlecht an und alle Optionen sind im Dropdown-Menü.Bind Objekteigenschaft zu Combobox

Aber wenn ich den Fokus der Combobox auf die button ändern, um das Ergebnis zu testen, wird es wieder männlich (in meinem Test möchte ich das Geschlecht auf weiblich ändern).

Wie kann ich sicherstellen, dass der neue Gender-Wert an mein Objekt übergeben wird?

Dies ist mein Codebeispiel

Public Class Form1 

    Private Personobject As Person 

    Public Sub New() 
     ' This call is required by the designer. 
     InitializeComponent() 

     ' Add any initialization after the InitializeComponent() call. 
     Personobject = New Person 
     Personobject.Gender = GenderEnum.Male 

     Dim enumType As Type = GetType(GenderEnum) 
     Dim names() As String = [Enum].GetNames(enumType) 

     For Each s As String In names 
      ComboBox1.Items.Add(s) 
     Next 

     ComboBox1.DataBindings.Add("Text", Personobject, "Gender") 
    End Sub 

    Private Enum GenderEnum 
     Male 
     Female 
    End Enum 

    Private Class Person 
     Public Property Gender As GenderEnum 
    End Class 

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
     Debug.Print(Personobject.Gender.ToString) 
    End Sub 
End Class 

Antwort

1

Wenn Sie Datenbindung verwenden, dann ComboBox.DataSource verwenden für

Public Class Form1 

    Private _Person As Person 

    Public Sub New() 
     ' This call is required by the designer. 
     InitializeComponent() 

     ' Add any initialization after the InitializeComponent() call. 

     ' Bound list of enums to the combobox 

     Dim genderList As List(Of GenderEnum) = [Enum].GetValues(GetType(GenderEnum)) 
                .OfType(Of GenderEnum) 
                .ToList() 
     ComboBox1.DataSource = genderList 

     _Person = New Person With { .Gender = GenderEnum.Male } 

     // Bound Person.Gender to the ComboBox.SelectedValue 
     ComboBox1.DataBindings.Add("SelectedValue", _Person, NameOf(_Person.Gender), True) 

    End Sub 

    Private Enum GenderEnum 
     Male 
     Female 
    End Enum 

    Private Class Person 
     Public Property Gender As GenderEnum 
    End Class 

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
     Debug.Print(Personobject.Gender.ToString) 
    End Sub 
End Class 

Unsere Sammlung von Produkten für die Auswahl und ComboBox.SelectedValue als gewählte Wert verbindlich, wenn Sie COMBOBOX wollen ausgewählt Wert geändert, wenn Sie _person.Gender woanders aktualisieren, als Person Klasse müssen INotifyPropertyChanged Schnittstelle implementieren und PropertyChanged Ereignis im Setter erhöhen von Gender Eigentum.

+0

Ich bekomme einen Fehler in dieser Zeile 'Dim genderList als neue Liste (von Geschlecht) ([Enum] .GetValues ​​(GetType (Geschlecht)))' es wird das Geschlecht nicht akzeptieren und die möglichen Korrekturen sind nicht verfügbar. Muss ich etwas importieren? –

+0

In der Antwort behoben. Sie müssen es in ein Array von 'Gender' umwandeln, so dass es' [Enum] .GetValues ​​(GetType (Geschlecht)) ist. OfType (Of Gender) ' – Fabio

+0

Typ 'Geschlecht' ist nicht definiert. Trotzdem bleibt der Fehler bestehen. –