繁体   English   中英

绑定到ObservableCollection中的项目字段的总计,并在值更改时更新

[英]Bind to total of an items field in an ObservableCollection and update when values change

我有一个ObservableCollection,可在WPF中填充数据网格。 我需要绑定到“小时数”列的总数,并且当“小时数”列中的值更改时要更新该总数。 我可以通过侦听“ LostFocus”事件并运行一个函数来实现此目的,但是我想尝试绑定。

我遇到的问题是,更改集合中的items属性时,不会触发NotifyPropertyChanged事件。

触发分类类NotifyPropertyChanged将触发,但集合不会将其解释为自身属性的更改。 如何从Missions类的集合中侦听出炉的PropertyChanged?

我的模特儿

public class Mission : INotifyPropertyChanged
{
    private ObservableCollection<Sortie> sorties;
    public ObservableCollection<Sortie> Sorties
    {            
        get { return this.sorties; }
        set
        {

            if (this.sorties != value)
            {
                this.sorties = value;                   
                this.NotifyPropertyChanged("Sorties");   
            }
        }  
    } 
    public event PropertyChangedEventHandler PropertyChanged;
    public void NotifyPropertyChanged(string propName)
    {
        if (this.PropertyChanged != null)
        {
            this.PropertyChanged(this, new PropertyChangedEventArgs(propName));
        }
    }
} 

public class Sortie : INotifyPropertyChanged
{
    private double hours;
    public double Hours
    {
         get {return this.hours;}
         set
         {
            if (this.hours != value)
            {
                this.hours = value;
                this.NotifyPropertyChanged("Hours");
            }
         }
    }
    public event PropertyChangedEventHandler PropertyChanged;
    public void NotifyPropertyChanged(string propName)
    {
        if (this.PropertyChanged != null)
        {
            this.PropertyChanged(this, new PropertyChangedEventArgs(propName));
        }
    }
}

我没有费心发布XAML或View模型,因为我有信心一旦我学会了如何为集合触发PropertyChanged事件,就可以解决该问题,并且我想避免您不得不阅读大量代码。 但是,如果您认为有此需要,请告诉我。

在计算值的父视图模型中编写一个只读属性。

public double SortieHours => Sorties.Sum(x => x.Hours);

父视图模型处理PropertyChanged在每个项目Sorties ,并CollectionChangedSorties CollectionChangedSorties ,你要添加/删除PropertyChanged从处理器Sortie ,因为它们可以添加和删除实例。 当您得到一个新的Sorties集合时(出于这个原因,您可能希望将该设置器设为私有),您需要抛弃所有旧的处理程序并添加新的处理程序。

现在,每当添加或删除一个Sortie或更改其Hours或有人将您交给新的Sorties集合时,请引发PropertyChanged

OnPropertyChanged(nameof(SortieHours));

并将该属性绑定到XAML中所需的任何内容。

这看起来很可怕(因为如此),但是您还要做什么?

很多人会建议您给Sortie一个HoursChanged事件。 PropertyChanged在这种情况下很烦人,因为它可以针对多个不同的属性引发,并且您必须检查哪个属性。 这是一个神奇的东西。

以上是C#6。 对于C#5,

public double SortieHours { get { return Sorties.Sum(x => x.Hours); } }

OnPropertyChanged("SortieHours");

我发现此链接有很大帮助。 它为ObservableCollections创建基类,以“自动”将集合项的PropertyChanged事件添加到CollectionChanged事件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM