2012-11-14 92 views
3

我有一个类(我们称之为MyContainerClass),它是其他几个类的容器(我们称它们为ClassAClassF)。 ClassAClassF继承了相同的基类(我们称之为MyBaseClass)。在MyBaseClass我有一个int名称Count,其中ClassAClassF继承。我在MyContainerClass中也有一个同名的int属性,它是ClassAClassF之和。INotifyPropertyChanged:通知其他类

然后我有一个数据网格,每一行有一个对象MyContainerClass。网格的列显示ClassAClassF。网格中的最后一列显示了总数(即它是MyContainerClassCount属性的绑定)。现在,我希望在更改A-F范围内的任何类别中的Count属性后,立即更新最后一列中的总数。我在MyBaseClass中实现了INotifyPropertyChanged,并且在将ClassA中的Count属性更改为ClassF时,它会触发。但是我的数据网格中的最后一列保持不变。任何线索?

编辑: 我已经创建了一个类图。 enter image description here

利用getCount()方法返回objA.Count + objB.Count + ... + objF.Count并通过在MyContainerClassCount属性返回。问题是:如果我更新objA.Count,我希望GUI(即我的数据网格中的列)显示更新的总和。

+0

你说datagird保持不变,但属性本身是否改变?换句话说 - 您是否检查过“MyContainerClass”中的Count属性是否已更新? – Blachshma

+1

如果您可以为您的课程发布一些XAML和一些源代码,那么诊断出现问题会更容易! –

+0

@Blachshma,它已更新。如果我检查调试器中的对象,我总会看到正确的数字。只有GUI不更新。 – Peter

回答

3

只是实施INotifyPropertyChanged是不够的自动更新。 MyContainerClass对象需要“订阅”其他列中的MyBaseClass对象的更改通知。你可以处理这个问题的方法之一是通过增加类似下面的MyContainerClass的方法:

void SubscribeToCount(MyBaseClass item) 
{ 
    item.PropertyChanged += (s,e) => 
     this.Sum += (e.NewValue - e.OldValue); 
} 

你调用此方法在其他列的所有对象。 (这个问题并不清楚,但我认为有一个包装类包含MyClassA-FMyContainerClass的实例,它们将datagrid绑定到这个包装类的集合)。

+0

这解决了我遇到的同样的问题,我需要一个(最初计算的)属性来通知对不同类的更改。谢谢! – Dan

1

好的,下面是我在盯着Eren的解决方案一段时间后所做的工作:我还为容器类实现了INotifyPropertyChanged,并为每个对象注册了PropertyChanged事件。

objA.PropertyChanged += updateCount; 
objB.PropertyChanged += updateCount; 
objC.PropertyChanged += updateCount; 

...等等。然后我加了下面的方法

private void updateCount(object sender, PropertyChangedEventArgs e) 
{ 
    OnPropertyChanged("Count"); 
} 

现在我有我想要的行为。

+0

太棒了,这就是我现在已经了解你的问题的那种解决方案!我认为你可以将自己的答案标记为你接受的答案吗? –