为何List属性的Setter未触发?求排查解决建议
问题:List属性Setter不触发的原因
我定义了List<OrderLine>类型的属性OrderLines,给Setter加断点完全没触发,NotifyPropertyChanged也没执行。我用order.OrderLines.Add(line)的方式往集合里加元素,为啥Setter不工作?
相关代码:
private List<OrderLine> _orderLines = new(); public List<OrderLine> OrderLines { set { // 这里加断点没效果,NotifyPropertyChanged也没调用 if (value != this._orderLines) { this._orderLines = value; Recalculate(); NotifyPropertyChanged(); } } get { return this._orderLines; } } // 我是这么添加订单行的 order.OrderLines.Add(line)
原因解析
你调用order.OrderLines.Add(line)时,本质是先通过Getter拿到_orderLines这个List实例,再调用List自身的Add方法修改集合内部元素——整个过程没有给OrderLines属性重新赋值(也就是没用到=操作符),所以Setter代码根本不会被执行。
Setter只有在你给属性赋值的时候才会触发,比如写order.OrderLines = new List<OrderLine>();或者order.OrderLines = anotherList;这类代码时,才会进入Setter逻辑。
解决方案
如果需要在集合元素变化时触发通知(比如更新UI、调用Recalculate),应该用ObservableCollection<OrderLine>代替List<OrderLine>。它专门用于MVVM、WPF这类需要集合变更通知的场景,自带CollectionChanged事件,能在添加、删除元素时自动触发通知。
修改后的代码示例:
private ObservableCollection<OrderLine> _orderLines = new(); public ObservableCollection<OrderLine> OrderLines { get => _orderLines; set { if (value != _orderLines) { // 移除旧集合的事件监听 _orderLines.CollectionChanged -= OnOrderLinesChanged; _orderLines = value; // 给新集合添加事件监听 _orderLines.CollectionChanged += OnOrderLinesChanged; Recalculate(); NotifyPropertyChanged(); } } } private void OnOrderLinesChanged(object? sender, NotifyCollectionChangedEventArgs e) { // 集合元素变化时执行逻辑,比如重新计算 Recalculate(); } // 添加元素的方式不变,但现在元素变化时会触发OnOrderLinesChanged order.OrderLines.Add(line);
内容的提问来源于stack exchange,提问作者Phill Morgan
相关产品推荐
相关产品推荐

