2010-04-23 15 views
6

Quiero hacer algo que pensé que sería muy simple. Quiero vincular EntityCollection de Entity Framework generado a WPF DataGrid. También quiero que esta grilla sea ordenable.Entity Framework 4.0 Databinding with sorting not working

He intentado todo tipo de cosas para que esto ocurra, incluido el uso de un CollectionViewSource. Sin embargo, nada parece funcionar. Usar un CollectionViewSource normal alrededor de EntityCollection me da:

'System.Windows.Data.BindingListCollectionView' view does not support sorting. 

Ok ... extraño. Pensé que esto funcionaría. A continuación, en CollectionViewSource, intento configurar:

CollectionViewType="ListCollectionView" 

Genial, la clasificación ahora funciona. Pero espere, no puedo agregar o eliminar entidades usando la grilla ahora, presumiblemente porque ListCollectionView no admite esto con un contexto de entidad de marco.

Entonces, supongo que necesito capturar los eventos que salen de la cuadrícula de datos para agregar o eliminar entidades de forma manual de mi contexto. ¡Ahora no puedo encontrar un evento para capturar para detectar un agregado ...!

¿Por qué es esto tan difícil? Este debería ser el caso estándar de "demostración" que Microsoft debería haber diseñado.

¿Alguna idea?

Respuesta

2

BindingListCollectionView no es el problema directamente. Consulte 'System.Windows.Data.BindingListCollectionView' view does not support sorting en Microsoft Connect para obtener detalles sobre por qué no es compatible con la ordenación.

Por otro lado, ListCollectionView admite la ordenación obviamente utilizando una técnica diferente.

También probé el siguiente código y funcionó muy bien. Básicamente, he implementado su XAML desde el the other post en el código.

DatabaseContext.ObjectStateManager.ObjectStateManagerChanged += (o, args) => Debug.WriteLine(args.Element.ToString()); 

var collectionViewSource = new CollectionViewSource(); 
((ISupportInitialize)collectionViewSource).BeginInit(); 
collectionViewSource.CollectionViewType = typeof (ListCollectionView); 
collectionViewSource.Source = ((IListSource) DatabaseContext.Survey).GetList(); 
collectionViewSource.SortDescriptions.Add(new SortDescription {PropertyName = "Name"}); 
((ISupportInitialize)collectionViewSource).EndInit(); 

var editableCollectionView = (IEditableCollectionView)collectionViewSource.View; 
var survey = editableCollectionView.AddNew(); 

// Before this point ObjectStateManager event has occurred and Debug Output is written to. 

editableCollectionView.CommitNew(); 
DatabaseContext.SaveChanges(); // THIS WORKS TOO! 

Mi DatabaseContext.Survey es un ObjectQuery<Survey>. ¿Estás mostrando ObjectQuery o una consulta Linq-to-EF? El primero, obviamente, funciona para mí. Este último es donde veo un problema. Eso no se supone que funcione.

+0

Sí, el ListCollectionView funciona de hecho. Estaba confundido porque agregar esto a través de enlace de datos no agregaba a lo que pensaba que eran las colecciones "raíz" a las que estaba vinculando (myContext.Employees, por ejemplo). Me equivoqué al pensar que se trataba de colecciones mutables cuando en realidad no lo eran, y la única manera de llegar a mis "nuevas" entidades era a través del ObjectStateManager. –

+0

Esto parece funcionar muy bien. Es triste que las cosas predeterminadas de EF RAD no se ocupen de esto de la caja. Dicho esto, recuerde que si está utilizando ListCollectionView CollectionViewType con EF4, tendrá que establecer AutoGenerateColumns en False para evitar obtener las columnas EntityState y EntityKey. – Spooles

0

Parece que la vista no recibe notificaciones cuando se producen cambios. Entonces, acabo de hacer

myCollectionViewSource.View.Refresh(); //refresh CollectionViewSource of CollectionViewType="ListCollectionView" 

después de agregar/quitar elementos de la lista.

Pero luego todo el estado se actualiza (por ejemplo, debe restablecer la ordenación preseleccionada de nuevo). Debe verificar, si esto se ajusta a sus necesidades.