【发布时间】:2010-06-28 09:21:14
【问题描述】:
这个问题可能是糟糕的类设计或无知 - 请多多包涵:
我有 2 个类 - Chip(实现 INotifyPropertyChanged 并代表单个扑克筹码)和 ChipSet,它实现 INotifyPropertyChanged 并具有 Chip 的 ObservableCollection。
我有一个绑定到 Chip ObservableCollection 的 Datagrid 和一个绑定到 ChipSet 的 Textblock。
即。 gridChips.ItemsSource = 芯片组.芯片;
Chip 类有 3 个属性(为简单起见) - NumberPerPlayer、ChipValue 和 TotalValuePerPlayer。 TotalValuePerPlayer 没有像其他 2 个那样的属性集或关联的私有成员变量 - 它是动态基于 ChipValue 和 NumberPerPlayer 的乘积。
网格绑定到所有 3 个值并显示这 3 个列。只有前两个是可编辑的,第三个会随着其他两个的变化而更新。
到目前为止,这工作正常 - 我发现为了更新 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 { 得到 { 返回芯片值 * numberPerPlayer; } }
public void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
我的第二个主要问题是:然后我有一个显示所有 TotalValuePerPlayer 总数的标签(愚蠢地称为 TotalTotalValuePerPlayer)。我把它放在这样的 ChipSet 类中(它遍历 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 }
所以 - 问题在于,当 UI 中基于此字段的 2 列(NumberPerPlayer 或 ChipValue)中的任何一个发生更改时,它不会更新。
我如何告诉父类 - ChipSet,当它的 ObservableCollection 中的一个子类 (Chip) 成员更新时,它的 TotalTotalValuePerPlayer 成员要更新?
如果 TotalTotalValuePerPlayer 在 Chip 类中,我可以在它所基于的字段发生更改时通知它,但它在它上面的类中?
感谢您的建议!
罗德尼
【问题讨论】: