Как сделать пользовательскую коллекцию редактируемой в DataGrid в C # - PullRequest
0 голосов
/ 24 октября 2018

У меня есть класс бизнес-объектов, который содержит определение 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, но я не знаю, как добиться такого поведения.Любая помощь приветствуется.

1 Ответ

0 голосов
/ 24 октября 2018

В вашей исходной коллекции должен быть реализован неуниверсальный интерфейс IList, чтобы внутренние функции редактирования элемента управления DataGrid работали, как ожидалось.

List<T> и ObservableCollection<T> делают это, но HashSet<T> не например.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...