Laden...

ObservableEntityCollection Entity Framework [2 Way Binding WPF]

Erstellt von Ayke vor 12 Jahren Letzter Beitrag vor 12 Jahren 3.615 Views
Ayke Themenstarter:in
643 Beiträge seit 2006
vor 12 Jahren
ObservableEntityCollection Entity Framework [2 Way Binding WPF]

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