![](/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.