ObservableEntityCollection für das Entity Framework
Nachdem mir aufgefallen ist, das ich mit den ObjectSet von Entity Framework
kein 2 Way Binding zu einen WPF Control machen kann, weil es nicht von ICollectionChanged erbt hab ich folgendes geschrieben.
public class ObservableEntityCollection<TEntity> : ObservableCollection<TEntity> where TEntity : class
{
private ObjectSet<TEntity> _objectSet = null;
public delegate int SaveChangesMethod();
private SaveChangesMethod SaveChanges = null;
public ObservableEntityCollection(ObjectSet<TEntity> entity)
{
Init(entity, null);
}
public ObservableEntityCollection(ObjectSet<TEntity> entity, SaveChangesMethod SaveChanges)
{
Init(entity, SaveChanges);
}
private void Init(ObjectSet<TEntity> entity, SaveChangesMethod SaveChanges)
{
this._objectSet = entity;
this.SaveChanges = SaveChanges;
foreach (var item in _objectSet)
{
if (item is INotifyPropertyChanged)
{
INotifyPropertyChanged notifyPropertyChanged = item as INotifyPropertyChanged;
notifyPropertyChanged.PropertyChanged += new PropertyChangedEventHandler(notifyPropertyChanged_PropertyChanged);
}
base.InsertItem(this.Count, (TEntity)item);
}
}
void notifyPropertyChanged_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
TEntity _objectSetItem = (TEntity)sender;
SetItem(this.IndexOf(_objectSetItem), _objectSetItem);
}
protected override void InsertItem(int index, TEntity item)
{
if (_objectSet == null)
return;
_objectSet.AddObject(item);
if (SaveChanges != null)
SaveChanges();
base.InsertItem(index, item);
}
protected override void SetItem(int index, TEntity item)
{
if (_objectSet != null)
return;
var _objectSetItem = _objectSet.ElementAt(index);
if (_objectSetItem != null)
_objectSetItem = item;
if (SaveChanges != null)
SaveChanges();
base.SetItem(index, item);
}
protected override void RemoveItem(int index)
{
if (_objectSet != null)
return;
var _objectSetItem = _objectSet.ElementAt(index);
if (_objectSetItem != null)
_objectSet.DeleteObject(_objectSetItem);
if (SaveChanges != null)
SaveChanges();
base.RemoveItem(index);
}
protected override void MoveItem(int oldIndex, int newIndex)
{
if (_objectSet != null)
return;
var _objectSetItemOld = _objectSet.ElementAt(oldIndex);
if (_objectSetItemOld != null)
{
var _objectSetItemNew = _objectSet.ElementAt(newIndex);
if (_objectSetItemNew != null)
_objectSetItemNew = _objectSetItemOld;
}
if (SaveChanges != null)
SaveChanges();
base.MoveItem(oldIndex, newIndex);
}
protected override void ClearItems()
{
foreach (var item in _objectSet)
{
_objectSet.DeleteObject(item);
}
if (SaveChanges != null)
SaveChanges();
base.ClearItems();
}
}
ObservableEntityCollection, ObservableCollection, Entity, Entity Framework, 2 Way Binding, WPF