簡體   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