可观察集合 Raise 属性更改

3
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中得到通知当分数发生更改时,以便我可以重新计算。

实际上,我将整个实体绑定到GridView。每当列中的分数发生变化时,我希望我的总列自动计算总数并显示。

1个回答

2

注意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

还请查看这篇文章,它将教您如何避免通知中的“魔术字符串”(例如RaisePropertyChanged("Scores")e.PropertyName == "Score")。

注3

不要使用

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

最好使用

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

但这并不是必要的,这只是我的编码风格 :)

顺便问一下,为什么混合使用“平均值”和“总和”?这是错误吗?


非常感谢,我会实现这个功能。希望它能够正常工作。对于错误我很抱歉,应该是平均值而不是求和。 - Vinay
你好,当我添加了你的ObservableCollectionEx.cs文件后,我遇到了以下错误:无法解析符号ReaderWriterLock。 - Vinay
@Vinay 尝试添加对程序集 mscorlib 的引用 - http://msdn.microsoft.com/ru-ru/library/system.threading.readerwriterlock.readerwriterlock.aspx - chopikadze

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接