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

我遇到的问题是,更改集合中的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事件,就可以解决该问题,并且我想避免您不得不阅读大量代码。但是,如果您认为有此需要,请告诉我。

最佳答案

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

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

父viewmodel处理PropertyChanged中每个项目的SortiesCollectionChanged中的Sorties。在CollectionChanged上的Sorties中,您必须在添加和删除PropertyChanged实例时从它们添加/删除Sortie处理程序。当您获得一个新的Sorties集合时(出于这个原因,您可能希望将该 setter 设为私有(private)),您需要抛弃所有旧的处理程序并添加新的处理程序。

现在,每当添加或删除Sortie或更改Hours或有人将新的Sorties集合交给您时,请提高PropertyChanged:
OnPropertyChanged(nameof(SortieHours));

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

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

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

以上是C#6。对于C#5,
public double SortieHours { get { return Sorties.Sum(x => x.Hours); } }

OnPropertyChanged("SortieHours");

关于c# - 绑定(bind)到ObservableCollection中的项目字段的总计,并在值更改时更新,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39257530/

10-15 04:56