2012-04-23 3 views
3

Я использую DataGrid и BIND с помощью ObservableCollection в классеObservableCollection не CollectionChanged полезно в WPF MVVM

private ObservableCollection<StockItem> _stockList; 
public ObservableCollection<StockItem> StockList 
{ 
    get 
    { 
     return _stockList; 
    } 
    set 
    { 
     _stockList = value; 
     OnPropertyChanged("StockList");     
    } 
} 

StockItem ViewModel содержит свои свойства, которые являются колонки в DataGrid. В столбце DataGrid указан столбец «Сумма», значения которого изменяются с помощью столбца «Количественная цена» одного и того же набора данных.

У меня есть свойство TotalAmount в ViewModel, который рассчитывается в случае ObservableCollection CollectionChanged как

void OnStockListChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) 
{ 
    this.TotalAmount = this.StockList.Sum(t => t.Amount); 
} 

Эти значения обновляются только в TextBox связываются с TotalAmount при добавлении новой строки в DataGrid с некоторые данные. Я хочу, чтобы этот TextBox TotalAmount обновлялся, как только изменяется Количественный столбец в datagrid.

Как я могу это сделать.

StockItem Class

public class StockItem : ObservableObject, ISequencedObject 
{ 
    JIMSEntities dbContext = new JIMSEntities(); 
    public StockItem() 
    { 
     var qs = dbContext.Stocks.Select(s => s.StockName); 
     _stocks = new CollectionView(qs.ToArray()); 
     _stocks.CurrentChanged += new EventHandler(Stocks_CurrentChanged); 
    } 
    void Stocks_CurrentChanged(object sender, EventArgs e) 
    { 
     if (_stocks.CurrentItem != null) 
      StockName = _stocks.CurrentItem.ToString(); 
     var qs = (from p in dbContext.Stocks 
        where p.StockName.Contains(StockName) 
        select new { Unit = p.Unit, UnitPrice = p.UnitPrice }).SingleOrDefault(); 
     if (qs != null) 
     { 
      Unit = qs.Unit; 
      UnitPrice = (decimal)qs.UnitPrice; 
     } 
    } 

    private CollectionView _stocks; 
    public CollectionView Stocks 
    { 
     get 
     { 
      return _stocks; 
     } 
     set 
     { 
      _stocks = value; 
      OnPropertyChanged("Stocks"); 
     } 
    } 
    private int _sNo; 
    public int SNo 
    { 
     get 
     { 
      return _sNo; 
     } 
     set 
     { 
      _sNo = value; 
      OnPropertyChanged("SNo"); 

     } 
    } 
    private string _stockName; 
    public string StockName 
    { 
     get 
     { 
      return _stockName; 
     } 
     set 
     { 
      _stockName = value; 
      OnPropertyChanged("StockName"); 
     } 
    } 
    private decimal _unitPrice; 
    public decimal UnitPrice 
    { 
     get 
     { 
      return _unitPrice; 
     } 
     set 
     { 
      _unitPrice = value; 
      OnPropertyChanged("UnitPrice"); 
      OnPropertyChanged("Amount"); 
     } 
    } 
    private string _unit; 
    public string Unit 
    { 
     get 
     { 
      return _unit; 
     } 
     set 
     { 
      _unit = value; 
      OnPropertyChanged("Unit"); 
     } 
    } 

    private decimal _discount; 
    public decimal Discount 
    { 
     get 
     { 
      return _discount; 
     } 
     set 
     { 
      _discount = value; 
      OnPropertyChanged("Discount"); 
      OnPropertyChanged("Amount"); 
     } 
    } 
    private decimal _quantity; 
    public decimal Quantity 
    { 
     get 
     { 
      return _quantity; 

     } 
     set 
     { 
      _quantity = value; 
      OnPropertyChanged("Quantity"); 
      OnPropertyChanged("Amount"); 
     } 
    } 
    public decimal Amount 
    { 
     get 
     { 
      decimal total = Quantity * (UnitPrice - (UnitPrice * (Discount/100))); 
      return total; 
     } 
    }   

    public override string ToString() 
    { 
     return StockName; 
    } 
} 
+0

Выполняет ли ваш класс StockItem INotifyPropertyChanged? –

+0

Используйте [ObservableCollection, который также отслеживает изменения элементов в коллекции) (http://stackoverflow.com/q/269073/620360). – LPL

+0

Да, он реализует INotifyPropertyChanged –

ответ

7

так, в основном, то, что вы видите, связано с общей неправильной концепцией о ObservableCollection. OC не уведомляет, когда объекты, которые он содержит, изменяются. Он уведомляет об изменениях в ИТ (см. INotifyCollectionChanged) - при добавлении, удалении и т. Д.

то, что вы хотите сделать, сообщается в том случае, если обновлен StockItem, который содержится в OC. Вы будете иметь, чтобы сделать несколько вещей

1) убедитесь, что INotifyPropertyChanged (который вы говорите, что вы уже делаете) осуществляется на вашем StockItem
2) настроить или найти реализацию ObservableCollection, что будет оповещать, когда элемент, содержащийся в изменениях коллекции (here is one)

+0

Спасибо, чувак, эта связь мне помогла. Несмотря на то, что я видел этот класс ранее в StackOverFlow, но теперь я реализовал это в своем коде –

+0

рад помочь –

+2

Я знаю, что это воссоздание действительно старой темы, но у вас есть код, содержащийся в этой ссылке «здесь один» ? Веб-сайт теперь снят, и я по-прежнему очень люблю следовать примеру. Благодарю. –

1

Вы должны подписаться на PropertyChanged всех элементов в коллекции также пересчитывать значение, если Amount изменения на любом из пунктов, это немного грязный. Кто-то где-то мог бы написать служебные классы для этого ...

Смежные вопросы