I'm working on an Editor-GUI (C#, WPF, Windows-Desktop) for a quite complex domain model. The domain model consists of many different node types mainly coupled in a hierarchie. Also it is possible to create links/references from one object to another (which can be 1:m). You could imagine it as a kind of syntax tree with Class/Method definitions and calls to that methods (this is just a rought equivalent). At the moment the model is represented in-memory by different classes.
Now my problem is, how to monitor changes in the model, so that I can update different components of my gui and track internal states like "model has changed", trigger validation etc.
At the moment I'm using a mix of edit-functions that trigger some events to inform others and in some places the INotifyChanged-Logic from .NET/WPF.
In the end this works not very well and consise, especially for my linked objects - they have no hard reference inside the model, they are referenced by an identifier. Additionally I have to pollute my domain-model with all those notify-change logic, which ties this very tight to the framework.
At the moment I see 3 possible solutions:
Strictly pass all edits through an Editor-Service, so that could inform all other components/subscribers in an unified way. Cons: If you forget to use the service and edit an object "directly" no one will get informed, and editing simple properties might become cumbersome.
Use INotify... everywhere and create hard links for references. Cons: this will make the domain model even more complex and every Object still has to inform some kind of message-broker so that other components can be updated.
Use a message-based approach like "Change property XYZ on Object with ID 123" and send this message to all components and objects, and someone feels responsible to do that. Cons: This will create an insane overhead of Edit-Message-Classes and one will loose many possibilities concerning type-safety and refactoring.
So is there some best-practice way to edit a complex model and monitor model-changes?