Vincular un DataGridComboBoxColumn a un DataSet en WPF
Frecuentes
Visto 1,668 equipos
0
He visitado muchos temas al respecto pero sigo sin encontrar cual es la solución a mi problema, no puedo reutilizar lo que encuentro.
Creé un conjunto de datos que se completa con una consulta SQL en 2 tablas. Ambos tienen un campo común difícil, pero ninguna clave externa (no me preguntes, no puedo cambiar eso):
SELECT table1.reference, table2.reference, table1.category...
FROM table1, table2
WHERE table1.reference = table2.reference
...
dataAdapter.Fill(dataSetGrid, "table1");
Mi DataContext es correcto, mi DataSet está lleno (lo verifiqué) con valores correctos, configuré ItemsSource de DataGrid por:
this.grid1.ItemsSource = dataSetGrid.Tables[0].DefaultView;
Y luego probé muchas cosas, pero lo mejor que pude obtener es el primer elemento en mi ComboBox pero con 1 letra de cada fila.
Una de mis pruebas en el código Xaml:
<DataGridComboBoxColumn Header="Caméras"
x:Name="Cameras"
ItemsSource="{Binding article}"
SelectedValuePath="reference"
DisplayMemberPath="reference"
Width="*"/>
Este me da un cuadro combinado vacío, pero no tengo ningún problema en un DataGridTextColumn.
Funciona con una colección ObservableCollection de una clase, pero desearía poder usar un conjunto de datos por ahora (el rendimiento aumentó).
Gracias por su ayuda, y lo siento si me perdí algo obvio.
1 Respuestas
1
Después de dos días de golpearme la cabeza contra esos controles realmente extraños, finalmente descubrí la solución. De hecho, encontré algunas piezas de código que podrían haber encajado bien con mi problema, solo necesitaba el contexto correcto. Estoy seguro de que no entendí perfectamente cómo funcionan los enlaces con comboBoxes, pero aquí está mi solución:
Código detrás :
Data data = new Data();
this.DataContext = data;
this.gridCameras.ItemsSource = data.dataSetCameras.Tables[0].DefaultView;
Xaml:
<DataGridTemplateColumn Header="Cameras">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding reference}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.dataSetCameras.Tables[0].DefaultView}"
SelectedItem="{Binding article}"
SelectedValue="reference"
DisplayMemberPath="reference"/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
Donde 'referencia' es el nombre del campo en la tabla del conjunto de datos y 'artículo' es el nombre de la tabla que quiero vincular.
Todavía no sé por qué funciona con 'AncestorType={x:Type Window}' ya que estoy en un control de usuario y nunca entiendo cuándo debo usar "algo" en lugar de "{Binding algo}" en las propiedades , o cuál es la diferencia real entre "Path=" y "{Binding}", pero creo que "DataContext.dataSet" me permitió obtener un resultado, ya que solo "dataSet" no parece funcionar.
De todos modos, hice algunas pruebas, y es mucho más rápido usar un DataSet que una ObservableCollection of Class en mi caso (más de 400 referencias), pero ciertamente me perdí algo para aclararlo.
¡Espero que eso ayude a otros!
Respondido el 12 de junio de 14 a las 15:06
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas wpf dataset datagridcomboboxcolumn or haz tu propia pregunta.
Su vida como desarrollador de WPF será mucho más fácil si deja el
DataTable
con el código de acceso a datos y rellene algunas instancias de clase personalizadas con los datos específicamente para mostrarlos en la interfaz de usuario. - Sheridan@Sheridan Sí, eso es lo que hice primero, funciona perfectamente, pero como puedo tener más de 500 registros, pensé que sería mejor usar un DataSet, ya que evito la cosa collection.Add(new Class(param)) para cada uno. - Adrana
Mi aplicación trata con decenas de miles de registros y empaquetar los datos en clases adecuadas prácticamente no requiere tiempo. - Sheridan
@Sheridan Bueno, estoy seguro de que puedo manejar mi cantidad de datos fácilmente con una clase, pero sigo pensando que usar un conjunto de datos es más liviano, tal vez me preocupo demasiado por la optimización. Sin embargo, la razón principal es que tengo curiosidad acerca de cómo funciona con un conjunto de datos, podría ayudarme para otro proyecto, ¿quién sabe? - Adrana
Si le preocupa escribir código estándar profesional, entonces nunca debe reutilizar sus clases de acceso a datos en su interfaz de usuario; el principal se llama 'Separación de preocupaciones'. - Sheridan