【问题标题】:Observable collection Raise property changedObservable 集合 Raise 属性已更改
【发布时间】:2012-06-09 05:44:06
【问题描述】:
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。每当列中的分数发生变化时,我希望我的总计列自动计算总计并显示。

【问题讨论】:

    标签: observablecollection inotifypropertychanged


    【解决方案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);
    

    但这不一定,这只是我的编码风格:)

    顺便说一句,为什么它是混合的 - “平均”和“总和”?这是错误吗?

    【讨论】:

    • 非常感谢.. 我会实现的。希望这有效。抱歉这个错误,它必须是 Avarage 而不是 Sum。
    • 嗨,当我添加您的 ObservableCollectionEx.cs 文件时,我收到以下错误,无法解析符号 ReaderWriterLock。
    • @Vinay msdn.microsoft.com/ru-ru/library/… - 尝试添加对程序集的引用 mscorlib
    猜你喜欢
    • 2010-11-04
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 2015-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多