У меня есть класс бизнес-объектов, который содержит определение List<T>
для других бизнес-объектов.
Я не могу изменить структуру класса, поэтому я не могу просто использовать ObservableCollection<T>
вместо List<T>
, но я хочу использоватьObservableCollection<T>
функциональность.Итак, я создал своего рода наблюдаемый класс-оболочку для коллекции, как этот (также попробовал его с IList<T>
вместо ICollection<T>
).
public class CollectionObservableOverlay<T> : ICollection<T>, INotifyCollectionChanged
{
protected ICollection<T> _wrappedCollection;
#region ICollection<T> properties
public int Count { get { return _wrappedCollection.Count; } }
public bool IsReadOnly { get { return _wrappedCollection.IsReadOnly; } }
#endregion
public event NotifyCollectionChangedEventHandler CollectionChanged;
public CollectionObservableOverlay(ICollection<T> wrappedCollection)
{
_wrappedCollection = wrappedCollection;
}
protected void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
{
CollectionChanged?.Invoke(this, e);
}
#region ICollection<T> methods
public void Add(T item)
{
_wrappedCollection.Add(item);
OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, item));
}
public void Clear()
{
_wrappedCollection.Clear();
OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
}
public bool Contains(T item)
{
return _wrappedCollection.Contains(item);
}
public void CopyTo(T[] array, int arrayIndex)
{
CopyTo(array, arrayIndex);
}
public virtual bool Remove(T item)
{
bool removed = _wrappedCollection.Remove(item);
OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
return removed;
}
public IEnumerator<T> GetEnumerator()
{
return _wrappedCollection.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return ((IEnumerable)_wrappedCollection).GetEnumerator();
}
#endregion
}
Проблема в том, что когда я связываю экземпляр CollectionObservableOverlay
сDataGrid
как ItemsSource
и попытаться редактировать элементы, я получаю следующую ошибку:
System.InvalidOperationException
HResult=0x80131509
Message='EditItem' is not allowed for this view.
Source=PresentationFramework
Я попытался привязать к базовой коллекции напрямую, и это прекрасно работает для целей редактирования DataGrid
, поэтому базовый списокили содержащиеся в нем объекты не должны быть источником проблемы.
Я предполагаю, что мне не хватает некоторых функций, которые реализованы в конкретном типе List<T>
, но отсутствуют в IList<T>
или ICollection<T>
интерфейсы.
Я прочитал это и другие связанные вопросы и ответы, но ни один из них не дает решения о том, как это сделать, или не отвечает, если это возможно,Насколько я понимаю, ICollectionView
, предоставленные DataGrid
, должны реализовывать IEditableCollectionView
, но я не знаю, как добиться такого поведения.Любая помощь приветствуется.