bovender framework
C# framework that implements MVVM and more
EnumProvider.cs
1 /* EnumProvider.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 using System;
19 using System.Collections.Generic;
20 using System.Collections.ObjectModel;
21 using System.ComponentModel;
22 using System.Linq;
23 using System.Reflection;
25 
26 namespace Bovender.Mvvm
27 {
82  [Serializable]
83  public class EnumProvider<T> : INotifyPropertyChanged where T: struct, IConvertible
84  {
85  #region Public properties
86 
87  public T AsEnum
88  {
89  get
90  {
91  return _selectedItem.Value;
92  }
93  set
94  {
95  _selectedItem = GetViewModel(value);
96  AllPropertiesChanged();
97  }
98  }
99 
100  public EnumViewModel<T> SelectedItem
101  {
102  get
103  {
104  return _selectedItem;
105  }
106  set
107  {
108  if (value == null)
109  {
110  throw new ArgumentNullException(
111  "SelecteItem cannot be null because enums are not nullable.");
112  }
113  _selectedItem = value;
114  AllPropertiesChanged();
115  }
116  }
117 
118  public string ToolTip
119  {
120  get
121  {
122  return SelectedItem.ToolTip;
123  }
124  }
125 
129  public IEnumerable<EnumViewModel<T>> Choices
130  {
131  get
132  {
133  if (_choices == null)
134  {
135  _choices = new Collection<EnumViewModel<T>>();
136  foreach (T member in Enum.GetValues(typeof(T)))
137  {
139  member,
140  GetDescription(member),
141  GetTooltip(member));
142  vm.PropertyChanged += EnumViewModel_PropertyChanged;
143  _choices.Add(vm);
144  }
145  }
146  return _choices;
147  }
148  }
149 
150  #endregion
151 
152  #region Constructors
153 
154  public EnumProvider() {}
155 
156  public EnumProvider(T initialValue)
157  : this()
158  {
159  AsEnum = initialValue;
160  }
161 
162  #endregion
163 
164  #region Virtual methods
165 
176  protected virtual string GetDescription(T member)
177  {
178  Type type = typeof(T);
179  MemberInfo[] memberInfo = type.GetMember(member.ToString());
180  object[] attributes = memberInfo[0].GetCustomAttributes(
181  typeof(DescriptionAttribute), false);
182  if (attributes.Length > 0 && attributes[0] is DescriptionAttribute)
183  {
184  return ((DescriptionAttribute)attributes[0]).Description;
185  }
186  else
187  {
188  return member.ToString();
189  }
190  }
191 
201  protected virtual string GetTooltip(T member)
202  {
203  return null;
204  }
205 
206  void EnumViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e)
207  {
208  if (sender == SelectedItem)
209  {
210  OnPropertyChanged("SelectedItem");
211  }
212  OnPropertyChanged("Choices");
213  }
214 
215  #endregion
216 
217  #region Public methods
218 
227  {
228  return Choices.FirstOrDefault(item => item.Value.Equals(member));
229  }
230 
231  #endregion
232 
233  #region Private methods
234 
235  private void AllPropertiesChanged()
236  {
237  OnPropertyChanged("SelectedItem");
238  OnPropertyChanged("AsEnum");
239  OnPropertyChanged("Tooltip");
240  }
241 
242  private void OnPropertyChanged(string propertyName)
243  {
244  if (PropertyChanged != null)
245  {
246  PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
247  }
248  }
249 
250  #endregion
251 
252  #region INotifyPropertyChanged
253 
254  public event PropertyChangedEventHandler PropertyChanged;
255 
256  #endregion
257 
258  #region Private fields
259 
260  private EnumViewModel<T> _selectedItem;
261  private Collection<EnumViewModel<T>> _choices;
262 
263  #endregion
264  }
265 }
Facilitates WPF data binding to enums by providing an enumeration of Choices, read/write access to a ...
Definition: EnumProvider.cs:83
View model for enum members.
virtual string GetDescription(T member)
Returns a display string for a given enum value.
EnumViewModel< T > GetViewModel(T member)
Returns the view model for a given member.
virtual string GetTooltip(T member)
Returns a tooltip for the given enum member.