這個問題可能是個壞一流的設計和無知來更新一個動態的領域 - 請多多包涵:如何使用的ObservableCollection上的Silverlight數據網格
我有2個班 - 芯片(其中實現INotifyPropertyChanged,並表示單個籌碼)和ChipSet,它實現INotifyPropertyChanged並具有Chip的ObservableCollection。
我有一個Datagrid綁定到Chip ObservableCollection和一個綁定到ChipSet的Textblock。
即。 gridChips.ItemsSource = chipset.Chips;
芯片類有3個屬性(爲簡單起見) - NumberPerPlayer,ChipValue和TotalValuePerPlayer。 TotalValuePerPlayer沒有像其他2那樣的屬性集或關聯的私有成員變量 - 它動態地基於ChipValue和NumberPerPlayer的產品。
網格綁定到所有這3個值並顯示這3列。只有前2個是可編輯的,而第3個更新爲其他2個更改。
目前爲止工作正常 - 我發現爲了讓TotalValuePerPlayer列更新,如果任何其他列更新,我必須將此字段添加到PropertyChangedEventArgs(請參閱下面的代碼)。
我的第一個問題是這是更新基於其他字段的綁定類字段的最佳方式,並且不會在UI中更改(您無法直接編輯TotalValuePerPlayer)。
public int NumberPerPlayer
{
get { return numberPerPlayer; }
set
{
if (numberPerPlayer != value)
{
numberPerPlayer = value;
OnPropertyChanged("NumberPerPlayer");
OnPropertyChanged("TotalValuePerPlayer");
}
}
}
public decimal ChipValue
{
get { return chipValue; }
set
{
if (chipValue != value)
{
chipValue = value;
//all columns that are based on this need to be updated
OnPropertyChanged("ChipValue");
OnPropertyChanged("TotalValuePerPlayer");
}
}
公共小數TotalValuePerPlayer { {返回chipValue * numberPerPlayer; }}
public void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
我的第二,主要的問題是這樣的:當時我有一個標籤,該標籤顯示了總所有TotalValuePerPlayer總計(愚蠢稱爲TotalTotalValuePerPlayer)。我把這個芯片組類這樣的(它通過的ObservableCollection迭代,並總結了總數):
1 public decimal TotalTotalValuePerPlayer
2 {
3 get {
4 decimal totalTotalValuePerPlayer = 0;
5 foreach (Chip chip in chips)
6 {
7 totalTotalValuePerPlayer += chip.TotalValuePerPlayer;
8 }
9 return totalTotalValuePerPlayer;
10 }
11 }
所以 - 問題是,當任何一個2列(NumberPerPlayer或ChipValue)這個領域是基於在UI更改中,它不會更新。
如何告訴父類--ChipSet,當它的ObservableCollection中的某個子類(Chip)成員中的某個成員被更新時,它有更新的TotalTotalValuePerPlayer成員?
如果TotalTotalValuePerPlayer在Chip類中,那麼當它基於的字段發生變化時,我可以通知它,但它在上面的類中?
感謝您的任何建議!
羅德尼
嗨Blounty, 感謝您花時間回答 - 我有點困惑,我需要做的 - 是芯片組構造函數的外觀? chip.PropertyChanged + =(s,e)=> {OnPropertyChanged(「TotalTotalValuePerPlayer」); }; 你是否在Chip類上連接了一個事件處理器?你是否介意完整地寫出這個循環,因爲我不完全確定你的意思 - 非常感謝! – Rodney 2010-06-28 17:55:45
Hi Rodney,ChipSet構造函數中的所有代碼正在執行,正在循環遍歷ObservableCollection中的Chips並附加到每個Chip的PropertyChanged事件。這是因爲當Chip的任何一個屬性改變時,它都會將ChipSet的TotalTotalValuePerPlayer更新爲UI。 –
Blounty
2010-06-29 07:18:45
太棒了,謝謝Blounty(花了我一段時間才弄清楚這個語法 - 這對我來說是新的!) – Rodney 2010-06-29 16:56:57