VB.NET Forms ListBox 不显示数据源

VB.NET Forms ListBox doesn't display DataSource

我正在尝试 link 我的 ListBox 到 ObservableCollection。 这是我定义模组的class:

Public Class TroveMod
    Private m_FileName As String
    Private m_Enabled As Boolean
    Public Property FileName() As String
        Get
            Return m_FileName
        End Get
        Set(value As String)
            m_FileName = value
        End Set
    End Property

    Public Property Enabled() As Boolean
        Get
            Return m_Enabled
        End Get
        Set(value As Boolean)
            m_Enabled = value
        End Set
    End Property

    Public ReadOnly Property ModName()
        Get
            Return Path.GetFileNameWithoutExtension(FileName)
        End Get
    End Property
End Class

这是实际的 属性 ModList:

Public Property ModList() As ObservableCollection(Of TroveMod)
    Get
        Return m_ModList
    End Get
    Set(value As ObservableCollection(Of TroveMod))
        m_ModList = value
    End Set
End Property

我使用以下方式添加项目:

Private Sub AddMod(file__1 As String, enabled As Boolean)
    If File.Exists(file__1) Then
        ModList.Add(New TroveMod() With { _
             .FileName = file__1, _
             .Enabled = enabled _
        })
    End If
End Sub

每次我想使用 AddMod 向此集合添加一些内容时,它都不会在我的列表框中显示:/我向列表框添加了一个 ModListBindingSource 并将 DisplayMember 和 ValueMember 设置为 ModName 但它仍然不起作用.我还有一个状态标签,上面写着,它成功地将模组添加到集合中,但它只是不会在列表框中显示它们。我错过了什么吗?

ObservableCollection 并不是您想要的 - 这将允许您的代码通过事件查看集合的更改。例如,如果有多个演员向集合中添加项目并且您想知道这一点。在这种情况下,由于 'local' 代码正在添加项目,因此不需要。

也不清楚集合如何映射到 ListBox 作为 DataSource。试试这个:

Public Class Form...
    Private myList As New BindingList(Of TroveMod)

    Sub Form_Load(....
        theListBox.DataSource = myList
        theListBox.DisplayMember = "ModName"

现在,当您向 BindingList 添加内容时,它们将出现在 theListBox 中。如果某个项目 发生了变化 (例如名称),那么如果不做更多的工作,该变化将不会显示出来,但由于这些文件名似乎不太可能。

除非外部 class 也需要访问集合/BindingList,否则不需要表单 属性;在那种情况下,您可能不需要 setter.