You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 16:06:25