【问题标题】:Bind object property to combobox将对象属性绑定到组合框
【发布时间】:2017-05-25 23:55:47
【问题描述】:

我正在尝试为Combobox 添加绑定class property。该属性是一个枚举。我设法将项目从enum 加载到Combobox 可能有点不正统,但它的工作原理。 (也欢迎改进建议)然后当表单加载时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

【问题讨论】:

    标签: vb.net class oop combobox binding


    【解决方案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
    

    请注意,如果您希望在其他地方更新_person.Gender 时更改组合框选定的值,则Person 类需要实现INotifyPropertyChanged 接口并在Gender 属性的设置器中引发PropertyChanged 事件。

    【讨论】:

    • 我在这条线上收到一个错误Dim genderList As New List(Of Gender)([Enum].GetValues(GetType(Gender))) 它不接受性别并且潜在的修复不可用。我需要导入一些东西吗?
    • 已在答案中修复。您需要将其转换为 Gender 的数组,因此它将是 [Enum].GetValues(GetType(Gender)).OfType(Of Gender)
    • “性别”类型未定义。错误仍然存​​在。
    • 不要使用复制粘贴 :) 它是代码中的 GenderEnum
    • SelectedValue 在绑定到Person.Gender 时会自动赋值给它。如果您希望 Person.Gender 的更新将反映到 ComboBox,那么正如我提到的 Person 类需要实现 INotifyPropertyChanged。如果您有一些具体问题,请随时提出其他问题。