ObservableCollection内容更新时UI未同步更新的问题排查
问题原因及解决方案
核心原因
你的Channel模型类未实现INotifyPropertyChanged接口。
ObservableCollection<T>仅会在集合结构发生变化(如元素添加、移除、替换)时向UI发送更新通知。但当你修改集合内已有Channel对象的Measurement1/Measurement2属性值时,由于Channel本身不会触发属性变更事件,UI无法感知到这些属性的变化,因此不会同步更新。
另外,你的ViewModel中ChannelInfo的setter存在逻辑错误(未将传入值赋值给私有字段),不过这个问题不会导致属性更新失效——因为你是修改集合内元素的属性,而非替换整个集合:
// 错误的setter public ObservableCollection<Channel> ChannelInfo { get => channelInfo; set { OnPropertyChanged(); // 未赋值给channelInfo字段 } } // 修正后的setter public ObservableCollection<Channel> ChannelInfo { get => channelInfo; set { channelInfo = value; OnPropertyChanged(); } }
解决方案
1. 为Channel类实现INotifyPropertyChanged
让模型类的每个属性在值变更时触发PropertyChanged事件:
namespace DebugApp.Model; using System.ComponentModel; using System.Runtime.CompilerServices; public class Channel : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; private byte _id; public byte Id { get => _id; set { _id = value; OnPropertyChanged(); } } private string _fwVersion; public string FwVersion { get => _fwVersion; set { _fwVersion = value; OnPropertyChanged(); } } private int _measurement1; public int Measurement1 { get => _measurement1; set { _measurement1 = value; OnPropertyChanged(); } } private int _measurement2; public int Measurement2 { get => _measurement2; set { _measurement2 = value; OnPropertyChanged(); } } private void OnPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } }
2. 正确更新属性值
确保在GetChannelsUpdate函数中,直接修改ObservableCollection内已有Channel对象的属性值,而非创建新对象替换(如果是替换元素,ObservableCollection也会通知UI,但修改属性更高效)。
内容的提问来源于stack exchange,提问作者M. Herrmann
相关产品推荐
相关产品推荐

