2015-04-06 3 views
1

Когда я когда-либо добавить новый элемент в ObservableCollectionCollectionChanged случае работает отлично,ObservableCollection CollectionChanged событие problum

Вот 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)); 

, когда мне понравился этот пункт_PropertyChanged event not work скопированных элементов.

Как исправить эту проблему?

+0

вы на самом деле регистрирующий для BOM_CollectionChanged где-нибудь? я не вижу этого, но вы, очевидно, не включили инструментальные части кода. –

+0

Почему все регистрируются. В наборе BOMForDesignMasterModel Weight просто вызывайте NotifyPropertyChanged («TotalWeight»); И попросите рассчитать общий вес. – Paparazzi

+1

@SamAlex не уверен, что я понимаю вашу проблему, но когда вы создаете список, он не будет вызывать событие 'CollectionChanged' для элементов, которые вы передаете в конструкторе, потому что a) ему не нужно: b) обработчик событий CollectionChanged не назначен. В основном в установщике свойства «BOM», где вы назначаете обработчик «CollectionChanged», список уже полностью создан и содержит в нем начальные элементы. – dkozl

ответ

0

Я думаю, что это ваша проблема:

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); 
     } 
    } 
} 
Смежные вопросы