WPF ObservableCollection <T>против BindingList <T> - PullRequest
11 голосов
/ 06 июня 2011

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

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

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

Спасибо.

Ответы [ 5 ]

4 голосов
/ 06 июня 2011

Интерфейс 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 .

0 голосов
/ 02 января 2012

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

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

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

0 голосов
/ 07 июня 2011

Помогут ли эти ссылки?

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) против BindingList (Of T)?

0 голосов
/ 06 июня 2011

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

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

0 голосов
/ 06 июня 2011

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

...