远程桌面会话恢复后ObservableCollection大小限制失效问题
问题根源与解决方案
核心问题
你当前的LimitedCollection使用new关键字隐藏了基类的Insert方法,而非重写ObservableCollection的核心虚方法InsertItem。这种写法存在致命缺陷:当集合通过ObservableCollection<T>基类引用被调用时(比如远程桌面恢复后WPF绑定系统的内部操作),会直接执行基类的Insert逻辑,完全绕过你自定义的大小限制。
修正后的集合类
将自定义逻辑移至InsertItem方法(ObservableCollection的所有添加操作最终都会调用这个受保护的虚方法),确保所有添加项的行为都受限制:
public class LimitedCollection<T> : ObservableCollection<T> { private readonly int maxSize; public LimitedCollection(int maxSize) { this.maxSize = maxSize; } protected override void InsertItem(int index, T item) { // 达到最大容量时先移除末尾项 if (Count >= maxSize) { RemoveAt(maxSize - 1); // 移除后集合长度减一,调整插入索引避免越界 if (index > 0) index--; } base.InsertItem(index, item); } }
额外注意事项
- 类型声明规范:确保你的
Messages属性直接声明为LimitedCollection<string>,而非ObservableCollection<string>,彻底避免基类引用绕过限制的可能。 - 线程安全处理:你的
ReadMessage是异步方法,操作ObservableCollection时需确保在UI线程执行(WPF中可通过Dispatcher.Invoke/Dispatcher.BeginInvoke),避免多线程操作导致的集合状态异常。 - 覆盖其他修改方法:如果后续有批量添加、替换项的需求,还需重写
SetItem、ClearItems等方法,保证集合的所有修改行为都符合大小限制规则。
内容的提问来源于stack exchange,提问作者hassan Ma
相关产品推荐
相关产品推荐

