19 using System.Collections.Generic;
20 using System.Collections.ObjectModel;
21 using System.Collections.Specialized;
25 using System.ComponentModel;
37 : ObservableCollection<TViewModel> where TViewModel :
ViewModelBase 39 #region Public properties 41 public int CountSelected
43 get {
return _countSelected; }
46 _countSelected = value;
47 OnPropertyChanged(
new PropertyChangedEventArgs(
"CountSelected"));
51 public TViewModel LastSelected
53 get {
return _lastSelected; }
56 _lastSelected = value;
57 OnPropertyChanged(
new PropertyChangedEventArgs(
"LastSelected"));
63 #region Public methods 73 var selectedItems = Items.Where(vm => vm.IsSelected).ToList();
74 if (selectedItems.Count > 0)
77 selectedItems.ForEach(i => Items.Remove(i));
83 new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)
99 #region Abstract methods 101 protected abstract TViewModel CreateViewModel(TModel model);
109 _modelCollection = modelCollection;
115 BuildViewModelCollection();
120 #region Event handlers 127 void ViewModelCollection_CollectionChanged(
object sender, NotifyCollectionChangedEventArgs e)
132 case NotifyCollectionChangedAction.Add:
133 DoAddModelObjects(e.NewItems);
135 case NotifyCollectionChangedAction.Remove:
136 DoRemoveModelObjects(e.OldItems);
138 case NotifyCollectionChangedAction.Move:
141 case NotifyCollectionChangedAction.Replace:
142 DoRemoveModelObjects(e.OldItems);
143 DoAddModelObjects(e.NewItems);
145 case NotifyCollectionChangedAction.Reset:
146 BuildModelCollection();
157 void _modelCollection_CollectionChanged(
object sender, NotifyCollectionChangedEventArgs e)
162 case NotifyCollectionChangedAction.Add:
163 DoAddViewModelObjects(e.NewItems);
165 case NotifyCollectionChangedAction.Remove:
166 DoRemoveViewModelObjects(e.OldItems);
168 case NotifyCollectionChangedAction.Move:
171 case NotifyCollectionChangedAction.Replace:
172 DoRemoveViewModelObjects(e.OldItems);
173 DoAddViewModelObjects(e.NewItems);
175 case NotifyCollectionChangedAction.Reset:
176 BuildViewModelCollection();
182 private void viewModel_PropertyChanged(
object sender, PropertyChangedEventArgs e)
184 if (e.PropertyName ==
"IsSelected")
186 if (((TViewModel)sender).IsSelected)
188 LastSelected = sender as TViewModel;
197 OnViewModelPropertyChanged(sender, e);
202 #region Private methods 211 if (_synchronizing == 1)
213 _modelCollection.CollectionChanged += _modelCollection_CollectionChanged;
214 this.CollectionChanged += ViewModelCollection_CollectionChanged;
225 if (_synchronizing == 0)
227 _modelCollection.CollectionChanged -= _modelCollection_CollectionChanged;
228 this.CollectionChanged -= ViewModelCollection_CollectionChanged;
232 protected void BuildViewModelCollection()
238 foreach (TModel m
in _modelCollection)
240 AddViewModelWithEvent(m);
249 private void DoAddViewModelObjects(IList modelObjects)
251 foreach (TModel m
in modelObjects)
253 AddViewModelWithEvent(m);
257 private void DoRemoveViewModelObjects(IList modelObjects)
259 foreach (TModel m
in modelObjects)
262 Items.FirstOrDefault(
263 (TViewModel vm) => vm.IsViewModelOf(m)
269 private void BuildModelCollection()
274 _modelCollection.Clear();
275 foreach (TViewModel vm
in Items)
277 _modelCollection.Add((TModel)vm.RevealModelObject());
286 private void DoAddModelObjects(IList viewModelObjects)
288 foreach (TViewModel vm
in viewModelObjects)
290 vm.PropertyChanged += viewModel_PropertyChanged;
291 _modelCollection.Add((TModel)vm.RevealModelObject());
295 private void DoRemoveModelObjects(IList viewModelObjects)
297 foreach (TViewModel vm
in viewModelObjects)
299 vm.PropertyChanged -= viewModel_PropertyChanged;
300 _modelCollection.Remove((TModel)vm.RevealModelObject());
304 private void AddViewModelWithEvent(TModel model)
306 TViewModel viewModel = CreateViewModel(model);
307 viewModel.PropertyChanged += viewModel_PropertyChanged;
311 private void OnViewModelPropertyChanged(
object sender, PropertyChangedEventArgs args)
313 if (ViewModelPropertyChanged != null)
315 ViewModelPropertyChanged(sender, args);
321 #region Private fields 323 readonly ObservableCollection<TModel> _modelCollection;
324 private int _countSelected;
325 private int _synchronizing;
326 private TViewModel _lastSelected;
EventHandler< PropertyChangedEventArgs > ViewModelPropertyChanged
Relays property-changed events from the view models in the collection.
Collection of view models that automatically syncs with an associated collection of model objects...
void SynchronizeOn()
Turns on synchronization of the view model collection and the model collection by adding appropriate ...
void RemoveSelected()
Removes all selected view models from the collection.
void SynchronizeOff()
Turns off synchronization of the view model collection and the model collection by removing the event...