![](/img/trans.png)
[英]How to update a ComboBox when is bind to 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
,并CollectionChanged
上Sorties
。 在CollectionChanged
上Sorties
,你要添加/删除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.