2010-12-06 17 views
5

estoy usando un patrón de cuadrícula de datos .NET de esta manera:prisma/MVVM: Columnas unión a DataGrid

<DataGrid ItemsSource="{Binding Datensaetze}" AutoGenerateColumns="False"> 
<DataGrid.Columns> 
    <DataGridTextColumn Header="my col 1" Binding="{Binding MyCol1}"/> 
    <DataGridTextColumn Header="my col 2" Binding="{Binding MyCol2}"/> 
    <DataGridTextColumn Header="my col 3" Binding="{Binding MyCol3}"/> 
</DataGrid.Columns> 
</DataGrid> 

Esto está funcionando muy bien. Ahora quiero definir las columnas en ViewModel, y en lugar de establecer columnas fijas en xaml, quiero generarlas sobre la marcha. Sin embargo, si intento vincular las Columnas a cualquier cosa, recibo un error, diciendo

DataGrid.Columns es una propiedad de solo lectura y no se puede enlazar.

¿Hay alguna manera de enlazar dinámicamente las columnas DataGrid con algo en el código subyacente?

Respuesta

9

Sí, la propiedad Columnas es ReadOnly, por lo que no podemos enlazarla directamente. Si desea vincular columnas, puede intentar utilizar una propiedad adjunta a la que se vincula, que a su vez actualiza las columnas.

actualización
Utilizando el delta de los cambios en el evento CollectionChanged.

A continuación, se puede enlazar la propiedad BindableColumns a su ColumnsCollection

<DataGrid AutoGenerateColumns="False" 
      local:DataGridColumnsBehavior.BindableColumns="{Binding ColumnCollection}"> 
    <!-- ... --> 
</DataGrid> 
+0

He estado usando esta bien, pero me he encontrado con un problema en el que es necesario que actualice la ObservableCollection en un subproceso en segundo plano (Estoy usando el Dispatcher para hacer esto). El código anterior cae en el delegado CollectionChanged con el error "El hilo que llama no puede acceder a este objeto porque lo posee un hilo diferente". ¿Alguna sugerencia de lo que puedo hacer? –

+0

Estoy en la misma situación que Andrew Stephens. No puedo encontrar una forma de evitar eso. ¿Alguien ayuda? – ncourcy84

+0

Creo que primero hay que desvincular el origen de los elementos para poder actualizarlo en el hilo de fondo. No puede acceder a ningún objeto vinculado a una interfaz de usuario (con raisepropertychanged/collectionchanged) en el hilo de fondo. Otra opción es usar un objeto diferente que debe cambiar/acceder en el hilo de fondo. Luego use Continuar con (si está usando una tarea) luego pase ese objeto al bloque ContinueWith. – Lance

Cuestiones relacionadas