{include:Header, Design}
{scrollbar}
Currently events are handled very bad since everything is subscribed to everything (Project explorer to Model.DataItems.Added/Removed, Folder.DataItems.Added/Removed, etc.). As result it makes things very difficult to manage when objects are added / removed. Especially when these subsciption happen in external plugins (HABITAT, Verkenner...).
Better way to inform containers of the collections is to *inform* parent about changes (INotifyPropertyChanged) of the underlying object or let *only* container subscribe to collection contained in it.
In a few words:
Arrows show what object is subscribed to what.
h3. Allowed Subscription of events
{flowchart}"Container" -> "IEventedList<SomeType>" -> "SomeType"{flowchart}
{flowchart}
"Gui Form1 where SomeType is a Model" -> "SomeType"
{flowchart}
{flowchart}
"Gui Form1 where Container is a Model" -> "Container"
{flowchart}
h3. *Anti-Pattern*
{flowchart}
"Gui Form1 where Container is a Model" -> "Container" -> "IEventedList<SomeType>" -> "SomeType"
"Gui Form1 where Container is a Model" -> "IEventedList<SomeType>" [ label = "FORBIDDEN" ];
"Gui Form1 where Container is a Model" -> "SomeType" [ label = "FORBIDDEN" ];
{flowchart}
In general the rule is: when you need to Subscribe / Unsubscribe frequently to events - you have to review your design of how event subscription is organized.
h3. Consequences for DelftShell
* Refactor all subscription of events in ProjectExplorer, HABITAT, etc.
|