WPF ObservableCollection vs BindingList

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

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

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

спасибо.

5 ответов


на IBindingList интерфейс и BindingList класс определяется в системе.Пространство имен 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 интерфейс.


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


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

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


поможет ли эта ссылка ?

http://xceed.com/CS/blogs/dontpanic/archive/2009/04/01/i-notify-we-notify-we-all-wait-no-we-don-t.aspx (очень полезно, даже если помечено как "Xceed";)

ObservableCollection (of T) vs BindingList (of T)?


Если вы можете обновить до NetAdvantage 2011 Том 2 Добавить новую запись будет работать при привязке к ObservableCollection.

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

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