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
相关产品推荐
相关产品推荐

