WPF ObservableCollection <T> vs BindingList <T>

В моем приложении WPF у меня есть XamDataGrid. Сетка привязана к ObservableCollection. Мне нужно разрешить пользователям вставлять новые строки через сетку, но оказывается, что для того, чтобы строка "Добавить новую строку" была доступна, источнику xamDataGrid необходимо реализовать IBindingList. ObservableCollection не реализует этот интерфейс.

Если я изменю свой источник на BindingList, он будет работать нормально. Однако, из того, что я могу понять, прочитав эту тему, BindingList действительно является вещью WinForms и не полностью поддерживается в WPF.

Неужели я ошибаюсь, если я изменил все свои ObservableCollections на BindingLists? Кто-нибудь имеет какие-либо другие предложения относительно того, как я могу добавить новую функциональность строки для моего xamDataGrid, сохранив источник как ObservableCollection? Я понимаю, что существует множество различных сеток, которые требуют реализации IBindingList для поддержки добавления новых функциональных возможностей ряда, но большинство решений, которые я вижу, - это просто перейти к BindingList.

Спасибо.

Ответ 1

Интерфейс IBindingList и BindingList класс определенные в пространстве имен System.ComponentModel, и поэтому не являются строго связанными с Windows Forms.

Вы отметили xamGrid поддерживает привязку к ICollectionView источник? Если это так, вы можете открыть свои источники данных с помощью этого интерфейса и вернуть его с помощью BindingListCollectionView.

Вы также можете создать подкласс ObservableCollection<T> и реализовать интерфейс IBindingList:

using System;
using System.ComponentModel;
using System.Collections.Generic;
using System.Collections.ObjectModel;

public class ObservableBindingList<T> : ObservableCollection<T>, IBindingList
{
    //  Constructors
    public ObservableBindingList() : base()
    {
    }

    public ObservableBindingList(IEnumerable<T> collection) : base(collection)
    {
    }

    public ObservableBindingList(List<T> list) : base(list)
    {
    }

    //  IBindingList Implementation
    public void AddIndex(PropertyDescriptor property)
    {
        throw new NotImplementedException();
    }

    public object AddNew()
    {
        throw new NotImplementedException();
    }

    public bool AllowEdit
    {
        get { throw new NotImplementedException(); }
    }

    public bool AllowNew
    {
        get { throw new NotImplementedException(); }
    }

    public bool AllowRemove
    {
        get { throw new NotImplementedException(); }
    }

    public void ApplySort(PropertyDescriptor property, ListSortDirection direction)
    {
        throw new NotImplementedException();
    }

    public int Find(PropertyDescriptor property, object key)
    {
        throw new NotImplementedException();
    }

    public bool IsSorted
    {
        get { throw new NotImplementedException(); }
    }

    public event ListChangedEventHandler ListChanged;

    public void RemoveIndex(PropertyDescriptor property)
    {
        throw new NotImplementedException();
    }

    public void RemoveSort()
    {
        throw new NotImplementedException();
    }

    public ListSortDirection SortDirection
    {
        get { throw new NotImplementedException(); }
    }

    public PropertyDescriptor SortProperty
    {
        get { throw new NotImplementedException(); }
    }

    public bool SupportsChangeNotification
    {
        get { throw new NotImplementedException(); }
    }

    public bool SupportsSearching
    {
        get { throw new NotImplementedException(); }
    }

    public bool SupportsSorting
    {
        get { throw new NotImplementedException(); }
    }
}

В качестве альтернативы вы можете подклассифицировать BindingList<T> и реализовать интерфейс INotifyCollectionChanged.

Ответ 2

Я не знаком с IBindingList, но, вероятно, я бы взял подход к написанию адаптера и/или класса расширения, который адаптирует ObservableCollection к IBindingList. Таким образом, вы можете сохранить свой знакомый код ObservableCollection (а также использовать его в других местах, кроме Infragistic DataGrid).

Ответ 3

Я думаю, что тебе не повезло. IBindingList не будет полностью поддерживаться сеткой, поэтому вы потеряете такие вещи, как сортировка, которую я верю. Но OC не выполняет поведение AddNew.

Я бы не использовал IBindingList, я бы просто добавил кнопку, чтобы вставить новый элемент в список, а затем установить сетку для редактирования этого элемента.

Ответ 5

Если вы можете выполнить обновление до 2-го тома NetAdvantage 2011, добавление новой записи будет работать при привязке к ObservableCollection.

Если вы используете NetAdvantage 2011 Volume 1 или старше, XamDataGrid также поддерживает интерфейс IEditableCollectionView, когда свойство CanAddNew возвращает true. Вы можете использовать ListCollectionView, предоставляя ему экземпляр вашего ObservableCollection, а затем привязывайте XamDataGrid к ListCollectionView.

Вы также можете использовать предыдущее предложение о выходе из ObservableCollection и реализации IBindingList в производном классе.