2017-01-11 3 views
0

Я пытаюсь добавить привязку для Combobox с class property. Свойство - это перечисление. Мне удалось загрузить предметы из enum в Combobox, может быть, немного неортодоксально, но он работает. (предложения по улучшению также приветствуются). Затем, когда форма загружается, Combobox показывает активный пол и все параметры находятся в выпадающем меню.Свойство Bind object для combobox

Но когда я сфокусирую фокус Combobox на button, чтобы проверить результат, он возвращается обратно к мужчине (в моем тесте я хочу изменить пол на самку).

Как я могу убедиться, что новое гендерное значение передано моему объекту?

Это мой пример кода

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 

ответ

1

Если вы используете привязки данных, а затем использовать ComboBox.DataSource для связывания набора элементов для выбора и ComboBox.SelectedValue в качестве выбранного значения

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 

Обратите внимание, что если вы хотите COMBOBOX выбранных значение изменилось при обновлении _person.Gender где-то в другом месте, чем Person класс необходимо реализовать INotifyPropertyChanged интерфейс и поднять PropertyChanged событие в сеттере от Gender Недвижимость.

+0

Я получаю сообщение об ошибке в этой строке 'Dim genderList As New List (Of Gender) ([Enum] .GetValues ​​(GetType (Пол)))' он не примет пол и потенциальные исправления недоступны. Нужно ли мне что-то импортировать? –

+0

Исправлено в ответе. Вам нужно преобразовать его в массив «Пол», поэтому он будет «[Enum] .GetValues ​​(GetType (Пол)). OfType (Of Gender)' – Fabio

+0

Тип «Пол» не определен. Тем не менее ошибка сохраняется. –

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