ObservableCollection CollectionChanged событие, проблема

1

Когда я добавляю новый элемент в 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, не работающее с копируемыми элементами.

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

  • 0
    Вы действительно регистрируетесь для BOM_CollectionChanged где-нибудь? я не вижу этого, но вы, очевидно, не включили инструментальные части кода.
  • 0
    Зачем все регистрироваться. В наборе BOMForDesignMasterModel Weight просто вызовите NotifyPropertyChanged ("TotalWeight"); И имейте это, вычисляют общий вес.
Показать ещё 2 комментария
Теги:
wpf
mvvm

1 ответ

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);
        }
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню