Когда я добавляю новый элемент в 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, а это не так.
Хотя вы не можете просто обновлять ObservableCollection, вы можете использовать Clear/Add/Remove для изменения его содержимого по мере необходимости. Чтобы ваш сеттер не был слишком сухим, я бы рекомендовал переместить эту логику в свой собственный метод и найти другой способ его запуска.
Это будет выглядеть примерно так:
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);
}
}
}