Vb.net Winforms ListBox控件在源更改后未更新

Vb.net Winforms ListBox控件在源更改后未更新,vb.net,winforms,binding,datatable,datasource,Vb.net,Winforms,Binding,Datatable,Datasource,我有一个列表框(LB),其中的DataTable(DT)数据源位于Form类中,全局填充在Form_Load事件中 Private Sub frmEditPresets_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load DT.Columns.Add("DisplayText") DT.Columns.Add("PresetID") For Each TSI As ToolSt

我有一个列表框(LB),其中的DataTable(DT)数据源位于Form类中,全局填充在Form_Load事件中

Private Sub frmEditPresets_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    DT.Columns.Add("DisplayText")
    DT.Columns.Add("PresetID")
    For Each TSI As ToolStripItem In Presets.DropDownItems
        If TSI.Name.IndexOf("preset_") > -1 Then
            DT.Rows.Add(TSI.Text, TSI.Name)
        End If
    Next
    LB.DataSource = DT
    LB.DisplayMember = "DisplayText"
End Sub
当我使用重命名按钮时。它会更新菜单项和数据源,但在单击列表框中的另一项之前,列表框不会刷新

重命名代码:

Private Sub btnRename_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRename.Click
    Dim R As DataRowView = LB.SelectedItem
    Dim S As String = InputBox("Preset Name", "Rename", R("DisplayText"))
    If S.Trim.Length = 0 Then Exit Sub
    If Presets.DropDownItems.ContainsKey(R("PresetID").ToString) Then
        Presets.DropDownItems(R("PresetID").ToString).Text = S
    End If
    R("DisplayText") = S
End Sub
我相信这是一个简单的问题,答案也很简单,但我似乎无法理解。我试过刷新()。我已尝试再次设置数据源。我读过这个StackOverflow问题,但是ResetBindings()似乎不是这个上下文中可用的方法


*编辑。正如史蒂夫提到的那样,我相信他的回答。尽管如此,我还是找到了
BindingContext(DT).EndCurrentEdit()
,它更新了我的LB显示并维护了选择。

尝试了这一点,但效果很好

Private Sub btnRename_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRename.Click  
    Dim R As DataRowView = LB.SelectedItem  
    Dim S As String = InputBox("Preset Name", "Rename", R("DisplayText"))  
    If S.Trim.Length = 0 Then Exit Sub  
    If Presets.DropDownItems.ContainsKey(R("PresetID").ToString) Then  
        Presets.DropDownItems(R("PresetID").ToString).Text = S  
    End If  
    R("DisplayText") = S  
    BindingContext(DT).EndCurrentEdit()
End Sub  

许多控件无法知道对象内部的某些内容何时发生了更改。如果我有一个
Foo
的绑定列表,它可能知道我是否添加/删除了
Foo
,但它不知道
Foo.Property
是否已更改。要传达这些更改,
Foo
需要实现INotifyPropertyChanged。类似的东西可能在这里起作用。。BindingContext(DT).EndCurrentEdit()更新了我的显示,但没有取消选择项:DFine,EndCurrentEdit更好。为了这个问题的未来读者,我将用你的建议更新我的答案……我不明白。你从哪里得到DT?@PsychoData它是一个类级数据表变量。见问题的第一行