30

I have multiple layers in an application and i find myself having to bubble up events to the GUI layer for doing status bar changes, etc . . I find myself having to write repeated coded where each layer simply subscribes to events from the lower layer and then in the call back simply raise an event up the chain. Is there a more efficient way of doing this?

leora
  • 188,729
  • 360
  • 878
  • 1,366

6 Answers6

35

If all you're doing is firing an event handler from another event handler, you can cut out the middle man and hook the event handlers directly in the add/remove blocks for the event.

For example, if you have a UserControl with a "SaveButtonClick" event, and all you want to do when is call the event handler when the "SaveButton" on your UserControl is clicked, you can do this:

public event EventHandler SaveButtonClick
{
    add { this.SaveButton.Click += value; }
    remove { this.SaveButton.Click -= value; }
}

Now you don't need any code to fire the SaveButtonClick event - it will automatically be fired when the SaveButton.Click event is raised (ie when someone clicks that button).

Matt Hamilton
  • 200,371
  • 61
  • 386
  • 320
  • That sounds interesting. Would love to see the implementation. – Maxime Rouiller Oct 20 '08 at 02:55
  • @Maxim - the code I've posted there *is* the implementation. If you have a UserControl with a button called SaveButton and you drop that UC onto a form, you can subscribe to SaveButtonClick from the form, and whenever the button is clicked your event handler will be called. – Matt Hamilton Oct 20 '08 at 02:58
  • i like the idea and easy implementation. but I don't like the dependency that you create between the usercontrol and the subscriber – Peter Gfader Jan 21 '10 at 21:37
  • 3
    the button is part of the subscriber though, aka, the button won't exist without the user control so the dependancy is fine. – Sekhat Apr 23 '10 at 09:10
3

Have a read of Jeremy Miller's blog "The Shade Tree Developer", especially his Write Your Own CAB series - the command pattern stuff he talks about there is probably what you need.

zastrowm
  • 8,017
  • 3
  • 43
  • 63
Bevan
  • 43,618
  • 10
  • 81
  • 133
3

Peter Rilling has posted a way of simulating Event Bubbling/Broadcasting in winforms. It is simple and effective.

http://www.codeproject.com/KB/cs/event_broadcast.aspx

Ben
  • 10,931
  • 9
  • 38
  • 47
1

Unless I see a bit more of the design.. it'll be hard to give a good answer.

WPF does bubble events up (automatically) the UI Component/Control tree... this has now been built into the framework. So I guess that's the recommended way :)

The trouble with bypassing the middle man Layer2 is that Layer1 and Layer3 now know each other... are coupled. So its a tradeoff.. if you are okay with the coupling.. eliminate the middle man / invent a specialized component with this responsibility. However if you expect Layer 3 to be hot-swappable (low coupling), I'd say continue bubbling.

Gishu
  • 134,492
  • 47
  • 225
  • 308
0

You can have a central channel that only support events. This channel must be independent so the layer only publish or subscribe to it.

Hapkido
  • 1,321
  • 1
  • 8
  • 13
0

Take a look at Update Controls .NET. These controls discover the parts of your data model that they depend upon even through layers of business logic. You don't have to write any code to notify them.

Michael L Perry
  • 7,327
  • 3
  • 35
  • 34