2011-06-06 19 views
10

En mi aplicación WPF tengo un XamDataGrid. La grilla está ligada a una ObservableCollection. Necesito permitir a los usuarios insertar nuevas filas a través de la cuadrícula, pero resulta que para que la fila "Agregar nueva fila" esté disponible, la fuente de xamDataGrid necesita implementar IBindingList. ObservableCollection no implementa esa interfaz.WPF ObservableCollection <T> vs BindingList <T>

Si cambio mi fuente a BindingList, funciona bien. Sin embargo, por lo que puedo entender al leer sobre este tema, BindingList es realmente algo de WinForms y no es totalmente compatible con WPF.

¿Estaría cometiendo un error si cambiara todas mis ObservableCollections a BindingLists? ¿Alguien tiene alguna otra sugerencia sobre cómo puedo agregar la nueva funcionalidad de fila para mi xamDataGrid manteniendo la fuente como ObservableCollection? Tengo entendido que hay varias redes diferentes que requieren la implementación de IBindingList para admitir la incorporación de nuevas funcionalidades de filas, pero la mayoría de las soluciones que veo son para cambiar a BindingList.

Gracias.

+1

¿Qué es un XamDatagrid en primer lugar? ¿Te refieres a la cuadrícula de datos de WPF toolkit? un componente de terceros? ¿Puede por favor también publicar un código de ejemplo :) – Bruno

+1

@ Bruno Es la versión de Infragistic de una cuadrícula de datos – Rachel

Respuesta

3

La interfaz IBindingList y la clase BindingList están definidas en el espacio de nombres System.ComponentModel, por lo que no están estrictamente relacionadas con Windows Forms.

¿Ha marcado xamGrid admite la vinculación a una fuente ICollectionView? De ser así, podría exponer sus fuentes de datos usando esta interfaz y respaldarla usando un BindingListCollectionView.

También podría crear una subclase de ObservableCollection<T> e implementar la interfaz 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(); } 
    } 
} 

Como alternativa, podría subclase BindingList<T> e implementar la interfaz INotifyCollectionChanged.

0

No estoy familiarizado con IBindingList, pero probablemente tomaría el enfoque de escribir un adaptador y/o una clase de extensión que adapte un ObservableCollection a un IBindingList. De esta manera, puede mantener su código ObservableCollection familiar (y también usarlo en otros lugares además del Infragistic DataGrid).

0

Creo que estás de suerte en cualquier caso. IBindingList no será totalmente compatible con la red, por lo que perderá cosas como la clasificación que creo. Pero OC no hace el comportamiento AddNew.

No utilizaría IBindingList, probablemente solo agregue un botón para insertar un nuevo elemento en la lista y luego configure la cuadrícula para editar ese elemento.

0

Si se puede actualizar a NetAdvantage 2011 Volumen 2 para agregar nuevo registro funcionará cuando se une a un ObservableCollection.

Si usa NetAdvantage 2011 Volume 1 o anterior, entonces XamDataGrid también admite la interfaz IEditableCollectionView cuando su propiedad CanAddNew devuelve verdadero. Podría usar un ListCollectionView dándole la instancia de su ObservableCollection y luego unir el XamDataGrid al ListCollectionView.

También podría utilizar la sugerencia anterior de derivar de ObservableCollection e implementar IBindingList en su clase derivada.

+0

He actualizado a v11.2 pero todavía no funciona. Al reemplazar OC por BL, funciona de nuevo. ¿Hay alguna configuración que deba establecer? – Marek

+0

@marek La única configuración que debería ser necesaria es AllowAddNew establecido en True en FieldLayoutSettings, que es necesario si utiliza una BindingList o una ObservableCollection . Probé esto con 11.2 esta mañana y AddNewRow funciona con una ObservableCollection. Si puede proporcionar una muestra que pueda ver en dónde no funciona, lo echaré un vistazo. – alhalama

Cuestiones relacionadas