You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF ListBox选中项双击修改后无法更新问题排查

问题原因及解决方案

核心错误点

  • 集合不支持变更通知:使用List(Of String)作为数据源,它未实现INotifyCollectionChanged接口,即便集合内元素被修改,WPF也无法感知到变更并更新UI。
  • 未同步修改值到集合:修改SelectedText后,没有将新值替换回ListTexts集合的对应位置;且字符串是值类型,绑定传递的是副本,修改TextBox文本不会直接更新集合内的元素。

修正步骤

1. 替换集合类型为ObservableCollection(Of String)

将List(Of String)替换为ObservableCollection(Of String),它内置集合变更通知机制,能自动通知UI更新。修改后的Gravures类代码:

Imports System.ComponentModel
Imports System.Collections.ObjectModel

Class Gravures
    Implements INotifyPropertyChanged
    Public Event PropertyChanged(sender As Object, e As PropertyChangedEventArgs) Implements INotifyPropertyChanged.PropertyChanged

    Private Property _ListTexts As New ObservableCollection(Of String)
    Private Property _selectedText As String

    Sub New()
        ListTexts.Add("toto")
        ListTexts.Add("titi")
    End Sub

    Public Sub OnPropertyChanged(ByVal e As PropertyChangedEventArgs)
        RaiseEvent PropertyChanged(Me, e)
    End Sub

    Public Property ListTexts As ObservableCollection(Of String)
        Get
            Return _ListTexts
        End Get
        Set(value As ObservableCollection(Of String))
            _ListTexts = value
            OnPropertyChanged(New PropertyChangedEventArgs("ListTexts"))
        End Set
    End Property

    Public Property SelectedText As String
        Get
            Return _selectedText
        End Get
        Set(value As String)
            Dim oldIndex = _ListTexts.IndexOf(_selectedText)
            If oldIndex >= 0 Then
                _ListTexts(oldIndex) = value
            End If
            _selectedText = value
            OnPropertyChanged(New PropertyChangedEventArgs("SelectedText"))
        End Set
    End Property
End Class

2. 调整TextBox绑定逻辑

将TextBox的绑定直接指向ViewModel的SelectedText,贴合MVVM模式:

<TextBox x:Name="TB_LigneText" HorizontalAlignment="Center" 
         Text="{Binding SelectedText, Mode=TwoWay}" 
         Width="300" Height="30" KeyDown="UpdateSelectedItem"/>

3. 验证效果

双击ListBox项弹出TextBox,修改文本后按回车关闭弹窗:

  • SelectedText的setter会自动定位集合中旧值的位置并替换为新值
  • ObservableCollection触发集合变更通知,ListBox自动更新显示内容

内容的提问来源于stack exchange,提问作者El doctor Sertato

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 10:20:25