ObservableCollection CollectionChanged事件问题

ObservableCollection CollectionChanged event problum

每当我向 ObservableCollection CollectionChanged 活动添加新项目时,

这是MVVM代码

public List<BOMForDesignMasterModel> BOMCollection { get; set; } 

public ObservableCollection<BOMForDesignMasterModel> BOM
    {
        get { return _BOM; }
        set
        {
            _BOM = value;
            NotifyPropertyChanged("BOM");
            BOM.CollectionChanged += BOM_CollectionChanged;
        }
    }
public DesignMasterModel DesignMaster
    {
        get
        {
            return _DesignMaster;
        }
        set
        {
            if (value != null)
            {
                _DesignMaster = value;
                BOM.Clear();
                BOM = new ObservableCollection<BOMForDesignMasterModel>(BOMCollection.Where(x => x.DesignMasterId == value.DesignMasterId));
                NotifyPropertyChanged("DesignMaster");
            }
        }
    }
void BOM_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {
        if (e.NewItems != null)
            foreach (BOMForDesignMasterModel item in e.NewItems)
                item.PropertyChanged += item_PropertyChanged;
        if (e.OldItems != null)
            foreach (BOMForDesignMasterModel item in e.OldItems)
                item.PropertyChanged -= item_PropertyChanged;

    }
    public String TotalWeight { get { return _TotalWeight; } set { _TotalWeight = value; NotifyPropertyChanged("TotalWeight"); } }
    void item_PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        if (e.PropertyName == "Weight")
        {
            TotalWeight = BOM.Sum(x => x.Weight).ToString();
        }
    }

这里是根据条件使用复制集合,

BOM = new ObservableCollection<BOMForDesignMasterModel>(BOMCollection.Where(x => x.DesignMasterId == value.DesignMasterId));

当我喜欢这个时 item_PropertyChanged 事件无法复制项目。

我该如何解决这个问题?

我认为这是你的问题:

BOM = new ObservableCollection<BOMForDesignMasterModel>(BOMCollection.Where(x => x.DesignMasterId == value.DesignMasterId));

当您像这样新建一个 ObservableCollection 时,您不会更改其 内容,这会触发 NotifyPropertyChanged。您正在更改 ObservableCollection 的 instance,但实际上并没有。

虽然您不能只新建 ObservableCollection,但您可以使用 Clear/Add/Remove 根据需要更改其内容。为了防止您的 setter 变得过于混乱,我建议将该逻辑移出到它自己的方法中,并找到其他触发它的方法。

看起来像这样:

private void RefreshBOM(int designMasterId)
{
    BOM.Clear();
    var bomResult = BOMCollection.Where(x => x.DesignMasterId == designMasterId);
    if(bomResult != null)
    {
        foreach(var result in bomResult)
        {
            BOM.Add(result);
        }
    }
}