@@ -15,6 +15,8 @@ private abstract class EventProperty
1515
1616 public abstract object BindHandler { get ; set ; }
1717
18+ public abstract bool IsEmpty { get ; }
19+
1820 public abstract void Add ( ) ;
1921
2022 public abstract void Remove ( ) ;
@@ -51,7 +53,15 @@ public override object BindHandler
5153 }
5254 }
5355
54- public GeneralEventProperty ( Action < EventHandler > add , Action < EventHandler > remove ) : base ( )
56+ public override bool IsEmpty
57+ {
58+ get
59+ {
60+ return _handler == null && _bindHandler == null ;
61+ }
62+ }
63+
64+ public GeneralEventProperty ( Action < EventHandler > add , Action < EventHandler > remove )
5565 {
5666 _add = add ;
5767 _remove = remove ;
@@ -105,6 +115,14 @@ public override object BindHandler
105115 }
106116 }
107117
118+ public override bool IsEmpty
119+ {
120+ get
121+ {
122+ return _handler == null && _bindHandler == null ;
123+ }
124+ }
125+
108126 public EventProperty ( Action < EventHandler < TEventArgs > > add , Action < EventHandler < TEventArgs > > remove )
109127 {
110128 _add = add ;
@@ -142,11 +160,6 @@ public void RemoveAll()
142160 }
143161 }
144162
145- public bool HasEventProperty ( string propertyName )
146- {
147- return _events . ContainsKey ( propertyName ) ;
148- }
149-
150163 public EventHandler GetEventProperty ( string propertyName )
151164 {
152165 if ( _events . TryGetValue ( propertyName , out EventProperty eventProperty ) )
@@ -167,52 +180,58 @@ public EventHandler<TEventArgs> GetEventProperty<TEventArgs>(string propertyName
167180
168181 public void SetEventProperty ( EventHandler handler , Action < EventHandler > add , Action < EventHandler > remove , string propertyName )
169182 {
170- if ( handler != null )
171- {
172- EventProperty eventProperty = _events . AddOrUpdate ( propertyName , this . CreateEventProperty , this . UpdateEventProperty , ( add , remove ) ) ;
173- eventProperty . Handler = handler ;
174- }
175- else
176- {
177- if ( _events . TryRemove ( propertyName , out EventProperty eventProperty ) )
178- {
179- eventProperty . Remove ( ) ;
180- eventProperty . Handler = null ;
181- }
182- }
183+ this . SetEventProperty ( handler , this . CreateEventProperty , ( add , remove ) , propertyName ) ;
183184 }
184185
185186 public void SetEventProperty < TEventArgs > ( EventHandler < TEventArgs > handler , Action < EventHandler < TEventArgs > > add , Action < EventHandler < TEventArgs > > remove , string propertyName )
186187 {
188+ this . SetEventProperty ( handler , this . CreateEventProperty , ( add , remove ) , propertyName ) ;
189+ }
190+
191+ private void SetEventProperty < TArg > ( object handler , Func < string , TArg , EventProperty > eventPropertyFactory , TArg factoryArgument , string propertyName )
192+ {
193+ EventProperty eventProperty ;
187194 if ( handler != null )
188195 {
189- EventProperty eventProperty = _events . AddOrUpdate ( propertyName , this . CreateEventProperty , this . UpdateEventProperty , ( add , remove ) ) ;
196+ eventProperty = _events . GetOrAdd ( propertyName , eventPropertyFactory , factoryArgument ) ;
190197 eventProperty . Handler = handler ;
191198 }
192- else
199+ else if ( _events . TryGetValue ( propertyName , out eventProperty ) )
193200 {
194- if ( _events . TryRemove ( propertyName , out EventProperty eventProperty ) )
201+ eventProperty . Handler = null ;
202+ if ( eventProperty . IsEmpty && _events . TryRemove ( propertyName , out eventProperty ) )
195203 {
196204 eventProperty . Remove ( ) ;
197- eventProperty . Handler = null ;
198205 }
199206 }
200207 }
201208
202- public void SetBindEventProperty ( string propertyName , EventHandler bindHandler )
209+ public void SetBindEventProperty ( string propertyName , EventHandler bindHandler , Action < EventHandler > add , Action < EventHandler > remove )
203210 {
204- if ( bindHandler != null && _events . TryGetValue ( propertyName , out EventProperty eventProperty ) )
205- {
206- eventProperty . BindHandler = bindHandler ;
207- }
211+ this . SetBindEventProperty ( propertyName , bindHandler , this . CreateEventProperty , ( add , remove ) ) ;
212+ }
213+
214+ public void SetBindEventProperty < TEventArgs > ( string propertyName , EventHandler < TEventArgs > bindHandler , Action < EventHandler < TEventArgs > > add , Action < EventHandler < TEventArgs > > remove )
215+ {
216+ this . SetBindEventProperty ( propertyName , bindHandler , this . CreateEventProperty , ( add , remove ) ) ;
208217 }
209218
210- public void SetBindEventProperty < TEventArgs > ( string propertyName , EventHandler < TEventArgs > bindHandler )
219+ private void SetBindEventProperty < TArg > ( string propertyName , object bindHandler , Func < string , TArg , EventProperty > eventPropertyFactory , TArg factoryArgument )
211220 {
212- if ( bindHandler != null && _events . TryGetValue ( propertyName , out EventProperty eventProperty ) )
221+ EventProperty eventProperty ;
222+ if ( bindHandler != null )
213223 {
224+ eventProperty = _events . GetOrAdd ( propertyName , eventPropertyFactory , factoryArgument ) ;
214225 eventProperty . BindHandler = bindHandler ;
215226 }
227+ else if ( _events . TryGetValue ( propertyName , out eventProperty ) )
228+ {
229+ eventProperty . BindHandler = null ;
230+ if ( eventProperty . IsEmpty && _events . TryRemove ( propertyName , out eventProperty ) )
231+ {
232+ eventProperty . Remove ( ) ;
233+ }
234+ }
216235 }
217236
218237 private EventProperty CreateEventProperty ( string propertyName , ( Action < EventHandler > add , Action < EventHandler > remove ) args )
@@ -222,21 +241,11 @@ private EventProperty CreateEventProperty(string propertyName, (Action<EventHand
222241 return eventProperty ;
223242 }
224243
225- private EventProperty UpdateEventProperty ( string propertyName , EventProperty eventProperty , ( Action < EventHandler > add , Action < EventHandler > remove ) args )
226- {
227- return eventProperty ;
228- }
229-
230244 private EventProperty CreateEventProperty < TEventArgs > ( string propertyName , ( Action < EventHandler < TEventArgs > > add , Action < EventHandler < TEventArgs > > remove ) args )
231245 {
232246 EventProperty eventProperty = new EventProperty < TEventArgs > ( args . add , args . remove ) ;
233247 eventProperty . Add ( ) ;
234248 return eventProperty ;
235249 }
236-
237- private EventProperty UpdateEventProperty < TEventArgs > ( string propertyName , EventProperty eventProperty , ( Action < EventHandler < TEventArgs > > add , Action < EventHandler < TEventArgs > > remove ) args )
238- {
239- return eventProperty ;
240- }
241250 }
242251}
0 commit comments