@@ -9,38 +9,139 @@ namespace Blazor.WebForm.UI
99{
1010 internal class EventHandlerDictionary
1111 {
12- private class EventProperty
12+ private abstract class EventProperty
1313 {
14- public object Handler { get ; set ; }
15- public object BindHandler { get ; set ; }
14+ public abstract object Handler { get ; set ; }
1615
17- public void Invoke ( object sender , EventArgs e )
16+ public abstract object BindHandler { get ; set ; }
17+
18+ public abstract void Add ( ) ;
19+
20+ public abstract void Remove ( ) ;
21+ }
22+
23+ private class GeneralEventProperty : EventProperty
24+ {
25+ private readonly Action < EventHandler > _add ;
26+ private readonly Action < EventHandler > _remove ;
27+ private EventHandler _handler ;
28+ private EventHandler _bindHandler ;
29+
30+ public override object Handler
31+ {
32+ get
33+ {
34+ return _handler ;
35+ }
36+ set
37+ {
38+ _handler = value as EventHandler ;
39+ }
40+ }
41+
42+ public override object BindHandler
43+ {
44+ get
45+ {
46+ return _bindHandler ;
47+ }
48+ set
49+ {
50+ _bindHandler = value as EventHandler ;
51+ }
52+ }
53+
54+ public GeneralEventProperty ( Action < EventHandler > add , Action < EventHandler > remove ) : base ( )
55+ {
56+ _add = add ;
57+ _remove = remove ;
58+ }
59+
60+ public override void Add ( )
61+ {
62+ _add ( this . Invoke ) ;
63+ }
64+
65+ public override void Remove ( )
66+ {
67+ _remove ( this . Invoke ) ;
68+ }
69+
70+ private void Invoke ( object sender , EventArgs e )
71+ {
72+ _bindHandler ? . Invoke ( sender , e ) ;
73+ _handler ? . Invoke ( sender , e ) ;
74+ }
75+ }
76+
77+ private class EventProperty < TEventArgs > : EventProperty
78+ {
79+ private readonly Action < EventHandler < TEventArgs > > _add ;
80+ private readonly Action < EventHandler < TEventArgs > > _remove ;
81+ private EventHandler < TEventArgs > _handler ;
82+ private EventHandler < TEventArgs > _bindHandler ;
83+
84+ public override object Handler
1885 {
19- if ( this . BindHandler is EventHandler bindHandler )
86+ get
2087 {
21- bindHandler . Invoke ( sender , e ) ;
88+ return _handler ;
2289 }
23- if ( this . Handler is EventHandler handler )
90+ set
2491 {
25- handler . Invoke ( sender , e ) ;
92+ _handler = value as EventHandler < TEventArgs > ;
2693 }
2794 }
2895
29- public void Invoke < TEventArgs > ( object sender , TEventArgs e )
96+ public override object BindHandler
3097 {
31- if ( this . BindHandler is EventHandler < TEventArgs > bindHandler )
98+ get
3299 {
33- bindHandler . Invoke ( sender , e ) ;
100+ return _bindHandler ;
34101 }
35- if ( this . Handler is EventHandler < TEventArgs > handler )
102+ set
36103 {
37- handler . Invoke ( sender , e ) ;
104+ _bindHandler = value as EventHandler < TEventArgs > ;
38105 }
39106 }
107+
108+ public EventProperty ( Action < EventHandler < TEventArgs > > add , Action < EventHandler < TEventArgs > > remove )
109+ {
110+ _add = add ;
111+ _remove = remove ;
112+ }
113+
114+ public override void Add ( )
115+ {
116+ _add ( this . Invoke ) ;
117+ }
118+
119+ public override void Remove ( )
120+ {
121+ _remove ( this . Invoke ) ;
122+ }
123+
124+ private void Invoke ( object sender , TEventArgs e )
125+ {
126+ _bindHandler ? . Invoke ( sender , e ) ;
127+ _handler ? . Invoke ( sender , e ) ;
128+ }
40129 }
41130
42131 private readonly ConcurrentDictionary < string , EventProperty > _events = new ConcurrentDictionary < string , EventProperty > ( ) ;
43132
133+ public void RemoveAll ( )
134+ {
135+ if ( ! _events . IsEmpty )
136+ {
137+ foreach ( EventProperty eventProperty in _events . Values )
138+ {
139+ eventProperty . Remove ( ) ;
140+ }
141+ _events . Clear ( ) ;
142+ }
143+ }
144+
44145 public bool HasEventProperty ( string propertyName )
45146 {
46147 return _events . ContainsKey ( propertyName ) ;
@@ -68,14 +169,14 @@ public void SetEventProperty(EventHandler handler, Action<EventHandler> add, Act
68169 {
69170 if ( handler != null )
70171 {
71- EventProperty eventProperty = _events . AddOrUpdate ( propertyName , this . CreateEventProperty , this . UpdateEventProperty , add ) ;
172+ EventProperty eventProperty = _events . AddOrUpdate ( propertyName , this . CreateEventProperty , this . UpdateEventProperty , ( add , remove ) ) ;
72173 eventProperty . Handler = handler ;
73174 }
74175 else
75176 {
76177 if ( _events . TryRemove ( propertyName , out EventProperty eventProperty ) )
77178 {
78- remove ( eventProperty . Invoke ) ;
179+ eventProperty . Remove ( ) ;
79180 eventProperty . Handler = null ;
80181 }
81182 }
@@ -85,14 +186,14 @@ public void SetEventProperty<TEventArgs>(EventHandler<TEventArgs> handler, Actio
85186 {
86187 if ( handler != null )
87188 {
88- EventProperty eventProperty = _events . AddOrUpdate ( propertyName , this . CreateEventProperty , this . UpdateEventProperty , add ) ;
189+ EventProperty eventProperty = _events . AddOrUpdate ( propertyName , this . CreateEventProperty , this . UpdateEventProperty , ( add , remove ) ) ;
89190 eventProperty . Handler = handler ;
90191 }
91192 else
92193 {
93194 if ( _events . TryRemove ( propertyName , out EventProperty eventProperty ) )
94195 {
95- remove ( eventProperty . Invoke ) ;
196+ eventProperty . Remove ( ) ;
96197 eventProperty . Handler = null ;
97198 }
98199 }
@@ -114,26 +215,26 @@ public void SetBindEventProperty<TEventArgs>(string propertyName, EventHandler<T
114215 }
115216 }
116217
117- private EventProperty CreateEventProperty ( string propertyName , Action < EventHandler > add )
218+ private EventProperty CreateEventProperty ( string propertyName , ( Action < EventHandler > add , Action < EventHandler > remove ) args )
118219 {
119- EventProperty eventProperty = new EventProperty ( ) ;
120- add ( eventProperty . Invoke ) ;
220+ EventProperty eventProperty = new GeneralEventProperty ( args . add , args . remove ) ;
221+ eventProperty . Add ( ) ;
121222 return eventProperty ;
122223 }
123224
124- private EventProperty UpdateEventProperty ( string propertyName , EventProperty eventProperty , Action < EventHandler > add )
225+ private EventProperty UpdateEventProperty ( string propertyName , EventProperty eventProperty , ( Action < EventHandler > add , Action < EventHandler > remove ) args )
125226 {
126227 return eventProperty ;
127228 }
128229
129- private EventProperty CreateEventProperty < TEventArgs > ( string propertyName , Action < EventHandler < TEventArgs > > add )
230+ private EventProperty CreateEventProperty < TEventArgs > ( string propertyName , ( Action < EventHandler < TEventArgs > > add , Action < EventHandler < TEventArgs > > remove ) args )
130231 {
131- EventProperty eventProperty = new EventProperty ( ) ;
132- add ( eventProperty . Invoke ) ;
232+ EventProperty eventProperty = new EventProperty < TEventArgs > ( args . add , args . remove ) ;
233+ eventProperty . Add ( ) ;
133234 return eventProperty ;
134235 }
135236
136- private EventProperty UpdateEventProperty < TEventArgs > ( string propertyName , EventProperty eventProperty , Action < EventHandler < TEventArgs > > add )
237+ private EventProperty UpdateEventProperty < TEventArgs > ( string propertyName , EventProperty eventProperty , ( Action < EventHandler < TEventArgs > > add , Action < EventHandler < TEventArgs > > remove ) args )
137238 {
138239 return eventProperty ;
139240 }
0 commit comments