C# WPF ListView绑定ObservableCollection后TextBox编辑值未同步问题
核心问题原因
你遇到的TextBox编辑值无法同步到EditCollection的问题,由两个底层原因共同导致:
string是不可变引用类型,修改字符串内容本质是生成全新的string对象,无法修改原有对象的存储值- XAML中使用
{Binding Path=.}绑定到集合元素本身时,WPF无法通过该绑定替换ObservableCollection中存储的原始元素,编辑后的新string对象不会回写入集合,因此集合中永远保留初始默认值。
解决方案
最常用的稳定方案是将字符串封装为支持属性通知的自定义模型类,修改绑定路径到模型类的属性,即可实现编辑值双向同步。
步骤1:新建字符串包装模型类
public class StringItem : INotifyPropertyChanged { private string _value; public string Value { get => _value; set { _value = value; OnPropertyChanged(nameof(Value)); } } public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } }
步骤2:修改ViewModel代码
private ObservableCollection<StringItem> _editCollection; public ObservableCollection<StringItem> EditCollection { get => _editCollection; set { _editCollection = value; OnPropertyChanged(nameof(EditCollection)); } } private ObservableCollection<string> _collection; public ObservableCollection<string> Collection { get => _collection; set { _collection = value; // 初始化编辑集合时做类型转换 EditCollection = new ObservableCollection<StringItem>( _collection.Select(x => new StringItem { Value = x }) ); OnPropertyChanged(nameof(Collection)); } } public void Save(object item) { // 保存时提取所有编辑后的值转成字符串集合 Collection = new ObservableCollection<string>( EditCollection.Select(x => x.Value).ToList() ); } public void AddToCollection(object item) { EditCollection.Add(new StringItem { Value = "default value" }); // 原有手动触发EditCollection通知的代码多余,ObservableCollection的Add方法会自动触发界面更新 }
步骤3:修改XAML绑定
<TextBox Text="{Binding Path=Value, UpdateSourceTrigger=PropertyChanged}"/>
修改后即可正常实现TextBox编辑值同步到EditCollection的需求。
内容的提问来源于stack exchange,提问作者Imightbehigh
相关产品推荐
相关产品推荐

