2010-06-28 54 views
1

這個問題可能是個壞一流的設計和無知來更新一個動態的領域 - 請多多包涵:如何使用的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類中,那麼當它基於的字段發生變化時,我可以通知它,但它在上面的類中?

感謝您的任何建議!

羅德尼

回答

1

您好,我相信你會解決這個你只需再前進一步的正確方法。下面是如何期望的類看:

芯片

public class Chip : INotifyPropertyChanged 
{ 
    private int numberPerPlayer; 
    public int NumberPerPlayer 
    { 
     get { return numberPerPlayer; } 
     set 
     { 
      if (numberPerPlayer != value) 
      { 
       numberPerPlayer = value; 
       OnPropertyChanged("NumberPerPlayer"); 
       OnPropertyChanged("TotalValuePerPlayer"); 
      } 
     } 
    } 

    private decimal chipValue; 
    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"); 
      } 
     } 
    } 

    public decimal TotalValuePerPlayer 
    { 
     get 
     { 
      return chipValue * numberPerPlayer; 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    public void OnPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

芯片組

public class ChipSet : INotifyPropertyChanged 
{ 
    public ChipSet() 
    { 
     foreach (var chip in Chips) 
     { 
      chip.PropertyChanged += (s, e) => { OnPropertyChanged("TotalTotalValuePerPlayer"); }; 
     } 
    } 


    public ObservableCollection<Chip> Chips { get; set; } 

    public decimal TotalTotalValuePerPlayer 
    { 
     get 
     { 
      return Chips.Sum(x => x.TotalValuePerPlayer); 
     } 
    } 

    public void OnPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
} 

我還沒有完全測試這一點,但它應該指向你在正確的方向。希望能幫助到你。

+0

嗨Blounty, 感謝您花時間回答 - 我有點困惑,我需要做的 - 是芯片組構造函數的外觀? chip.PropertyChanged + =(s,e)=> {OnPropertyChanged(「TotalTotalValuePerPlayer」); }; 你是否在Chip類上連接了一個事件處理器?你是否介意完整地寫出這個循環,因爲我不完全確定你的意思 - 非常感謝! – Rodney 2010-06-28 17:55:45

+0

Hi Rodney,ChipSet構造函數中的所有代碼正在執行,正在循環遍歷ObservableCollection 中的Chips並附加到每個Chip的PropertyChanged事件。這是因爲當Chip的任何一個屬性改變時,它都會將ChipSet的TotalTotalValuePerPlayer更新爲UI。 – Blounty 2010-06-29 07:18:45

+0

太棒了,謝謝Blounty(花了我一段時間才弄清楚這個語法 - 這對我來說是新的!) – Rodney 2010-06-29 16:56:57

相關問題