2012-06-05 72 views
1
private ObservableCollection<Scores> _scores; 
    public ObservableCollection<Scores> Scores 
    { 
     get 
     { 
      return _scores; 
     } 
     set 
     { 
      _scores = value; 
      RaisePropertyChanged("Scores"); 
      Recalculate(); 
     } 
    } 

    public int RowNumber { get; set; } 
    public string StudentId { get; set; } 
    public string StudentName { get; set; } 

    private double _studentAverage; 
    public double StudentAverage 
    { 
     get 
     { 
      return _studentAverage; 
     } 
     set 
     { 
      _studentAverage = value; 
      RaisePropertyChanged("StudentAverage"); 
     } 
    } 

    private string _gradeYear; 
    public string GradeYear 
    { 
     get 
     { 
      return _gradeYear; 
     } 
     set 
     { 
      _gradeYear = value; 
      RaisePropertyChanged("StudentGrade"); 
     } 
    } 


    private void Recalculate() 
    { 
     StudentAverage = (from score in Scores select score.Score).Sum(); 
    } 

嗨,我怎麼能得到ObservableCollection內部的分數變化,以便我可以重新計算通知。Observable collection提高屬性變化

其實我綁定整個實體到一個GridView。每當列中的分數發生變化時,我希望我的總計列自動計算總計並顯示。

回答

1

注1

簡而言之 - 你應該訂閱您所有的「得分」的INotifyPropertyChanged.PropertyChanged事件,在事件處理程序,你應該重計算的TotalScore。但問題是,您還應該監視Scores集合中的更改(當然,如果您需要它)。

作爲一個非常有用的幫手,你可以嘗試使用我的Extended ObservableCollection。這個類已經包含ItemPropertyChangedEvent,所以你應該只寫類似:

private ObservableCollectionEx<Scores> _scores; 

public ObservableCollectionEx<Scores> Scores 
{ 
    get 
    { 
     return _scores; 
    } 
    set 
    { 
     if (_scores == value) return; 
     if (_scores != null) 
      _scores.ItemPropertyChanged -= OnItemPropertyChanged; 
     _scores = value; 
     if (_scores != null) 
      _scores.ItemPropertyChanged += OnItemPropertyChanged; 
     RaisePropertyChanged("Scores"); 
     Recalculate(); 
    } 
} 

void OnItemPropertyChanged(object sender, PropertyChangedEventArgs e) 
{ 
    if (e.PropertyName == "Score") 
     Recalculate(); 
} 

注2

看看也在this article。它將教會如何避免通知中的「魔術串」(如RaisePropertyChanged("Scores")e.PropertyName == "Score")。注3

而不是

StudentAverage = (from score in Scores select score.Score).Sum(); 

,最好使用

StudentAverage = Scores.Sum(score => score.Score); 

但是,這並不一定,這只是我的編碼風格:)

順便說一句,爲什麼它是混合 - 「平均」和「總和」?這是錯誤嗎?

+0

非常感謝..我會執行此操作。希望這可以工作。對於錯誤感到抱歉,它必須是Avarage而不是Sum。 – Vinay

+0

嗨,當我添加您的ObservableCollectionEx.cs文件,我得到以下錯誤,無法解析符號ReaderWriterLock。 – Vinay

+0

你使用什麼版本的.NET框架? – chopikadze

相關問題