I have a class (let's call it MyContainerClass
)that is a container for several other classes (let's call them ClassA
to ClassF
). ClassA
to ClassF
inherit the same base class (let's call it MyBaseClass
). In MyBaseClass
I have an int property with the name Count
, which ClassA
to ClassF
inherit. I also have an int property with the same name in MyContainerClass
which is the sum of ClassA
to ClassF
.
Then I have a datagrid, and each row has one object of MyContainerClass
. The columns of the grid show ClassA
to ClassF
. The last column in the grid shows a total (that is it is bound the Count
property of MyContainerClass
). Now I want that the total in the last column updates as soon as I change the Count
property in any class in the A-F range. I implemented INotifyPropertyChanged in MyBaseClass
and it does fire when I change the Count
property in ClassA
to ClassF
. But the last column in my datagrid remains the same. Any clues?
EDIT: I have created a class diagram.
The getCount() method returns objA.Count+objB.Count+...+objF.Count and is returned by the Count
property in the MyContainerClass
. The question is: if I update objA.Count I want the GUI (that is the column in my datagrid) to display the updated sum.
To implement INotifyPropertyChanged you need to declare the PropertyChanged event and create the OnPropertyChanged method. Then for each property you want change notifications for, you call OnPropertyChanged whenever the property is updated.
Remarks. The INotifyPropertyChanged interface is used to notify clients, typically binding clients, that a property value has changed. For example, consider a Person object with a property called FirstName .
RaisePropertyChanged Method (ScheduleListDataSource)Notifies the data source of a change to a property value of the specified dataObject.
Just implementing INotifyPropertyChanged
is not enough for an automatic update. The MyContainerClass
object needs to "subscribe" to the change notifications of the MyBaseClass
objects in the other columns. One way you can handle this is by adding a method like the following to the MyContainerClass
:
void SubscribeToCount(MyBaseClass item)
{
item.PropertyChanged += (s,e) =>
this.Sum += (e.NewValue - e.OldValue);
}
And you call this method for all the objects in the other columns. (It's not clear from the question but I assume there is a wrapper class that includes instances of MyClassA-F
and MyContainerClass
, which you bind the datagrid to a collection of this wrapper class).
Okay, here is what I did after staring at Eren's solution for a while: I also implemented the INotifyPropertyChanged for the container class and registered the PropertyChanged
event for each object.
objA.PropertyChanged += updateCount;
objB.PropertyChanged += updateCount;
objC.PropertyChanged += updateCount;
...and so on. Then I added the following method
private void updateCount(object sender, PropertyChangedEventArgs e)
{
OnPropertyChanged("Count");
}
Now I have the behavior that I want.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With