bovender framework
C# framework that implements MVVM and more
CommandManagerHelper.cs
1 /* CommandManagerHelper.cs
2  * part of Daniel's XL Toolbox NG
3  *
4  * Copyright 2014-2018 Daniel Kraus
5  *
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  *
18  */
19 using System;
20 using System.Collections.Generic;
21 using System.Linq;
22 using System.Text;
23 using System.Windows.Input;
24 
25 namespace Bovender.Mvvm
26 {
35  internal class CommandManagerHelper
36  {
37  internal static void CallWeakReferenceHandlers(List<WeakReference> handlers)
38  {
39  if (handlers != null)
40  {
41  // Take a snapshot of the handlers before we call out to them since the handlers
42  // could cause the array to me modified while we are reading it.
43 
44  EventHandler[] callees = new EventHandler[handlers.Count];
45  int count = 0;
46 
47  for (int i = handlers.Count - 1; i >= 0; i--)
48  {
49  WeakReference reference = handlers[i];
50  EventHandler handler = reference.Target as EventHandler;
51  if (handler == null)
52  {
53  // Clean up old handlers that have been collected
54  handlers.RemoveAt(i);
55  }
56  else
57  {
58  callees[count] = handler;
59  count++;
60  }
61  }
62 
63  // Call the handlers that we snapshotted
64  for (int i = 0; i < count; i++)
65  {
66  EventHandler handler = callees[i];
67  handler(null, EventArgs.Empty);
68  }
69  }
70  }
71 
72  internal static void AddHandlersToRequerySuggested(List<WeakReference> handlers)
73  {
74  if (handlers != null)
75  {
76  foreach (WeakReference handlerRef in handlers)
77  {
78  EventHandler handler = handlerRef.Target as EventHandler;
79  if (handler != null)
80  {
81  CommandManager.RequerySuggested += handler;
82  }
83  }
84  }
85  }
86 
87  internal static void RemoveHandlersFromRequerySuggested(List<WeakReference> handlers)
88  {
89  if (handlers != null)
90  {
91  foreach (WeakReference handlerRef in handlers)
92  {
93  EventHandler handler = handlerRef.Target as EventHandler;
94  if (handler != null)
95  {
96  CommandManager.RequerySuggested -= handler;
97  }
98  }
99  }
100  }
101 
102  internal static void AddWeakReferenceHandler(ref List<WeakReference> handlers, EventHandler handler)
103  {
104  AddWeakReferenceHandler(ref handlers, handler, -1);
105  }
106 
107  internal static void AddWeakReferenceHandler(ref List<WeakReference> handlers, EventHandler handler, int defaultListSize)
108  {
109  if (handlers == null)
110  {
111  handlers = (defaultListSize > 0 ? new List<WeakReference>(defaultListSize) : new List<WeakReference>());
112  }
113 
114  handlers.Add(new WeakReference(handler));
115  }
116 
117  internal static void RemoveWeakReferenceHandler(List<WeakReference> handlers, EventHandler handler)
118  {
119  if (handlers != null)
120  {
121  for (int i = handlers.Count - 1; i >= 0; i--)
122  {
123  WeakReference reference = handlers[i];
124  EventHandler existingHandler = reference.Target as EventHandler;
125  if ((existingHandler == null) || (existingHandler == handler))
126  {
127  // Clean up old handlers that have been collected
128  // in addition to the handler that is to be removed.
129  handlers.RemoveAt(i);
130  }
131  }
132  }
133  }
134  }
135 }