c# - uso - ¿Cómo obtener el valor de un cuadro combinado escrito mediante programación en una cuadrícula de datos en wpf?
wpf tutorial español (1)
Para seguir mi publicación anterior aquí => Enlace SelectedItem de ComboBox en DataGrid con diferente tipo
Ahora tengo una cuadrícula de datos que contiene 2 columnas, una con un texto y la otra con un cuadro combinado (en una plantilla de datos, escrita a través del código C #, no de Xaml).
Después de haber hecho alguna elección en el cuadro combinado, ahora me gustaría analizar el resultado, pero el valor de la celda que contiene mi cuadro combinado permanece vacío:
foreach(DataRowView row in Datagrid1.Items)
{
var firstColumNresult = row.Row.ItemArray[0];// Return correctly a string
var myrow = row.Row.ItemArray[1];// always empty...
}
El resultado es que no puedo obtener los valores de mi cuadro combinado (generado anteriormente).
Supongo que un enlace debe perderse en algún lugar ...
Este es el código de creación de combobox:
DataTable tableForDG = new DataTable();
tableForDG.Columns.Add(new DataColumn { ColumnName = "Name", Caption = "Name" });
tableForDG.Columns.Add(new DataColumn { ColumnName = "Attachment", Caption = "Attachment" }); // this column will be replaced
tableForDG.Columns.Add(new DataColumn { ColumnName = "AttachmentValue", Caption = "AttachmentValue" });
tableForDG.Columns.Add(new DataColumn { ColumnName = "DisplayCombo", Caption = "DisplayCombo", DataType=bool });
// Populate dataview
DataView myDataview = new DataView(tableForDG);
foreach (var value in listResults)// a list of string
{
DataRowView drv = myDataview.AddNew();
drv["Name"] = value.Name;
drv["Attachment"] = value.Name;// this column will be replaced...
drv["DisplayCombo"] = true;// but it can be false on my code...
}
var DG = myDataview;//
Datagrid1.ItemsSource = DG;
Datagrid1.AutoGenerateColumns = true;
Datagrid1.Items.Refresh();
DataGridTemplateColumn dgTemplateColumn = new DataGridTemplateColumn();
dgTemplateColumn.Header = "Attachment";
var newCombobox = new FrameworkElementFactory(typeof(ComboBox));
newCombobox.SetValue(ComboBox.NameProperty, "myCBB");
Binding enableBinding = new Binding();
newCombobox.SetValue(ComboBox.IsEnabledProperty, new Binding("DisplayCombo"));
newCombobox.SetValue(ComboBox.SelectedValueProperty, new Binding("AttachmentValue"));
List<string> listUnitAlreadyAttached = new List<string>();
// fill the list...
enableBinding.Source = listUnitAlreadyAttached;
newCombobox.SetBinding(ComboBox.ItemsSourceProperty, enableBinding);
var dataTplT = new DataTemplate();
dataTplT.VisualTree = newCombobox;
dgTemplateColumn.CellTemplate = dataTplT;
Datagrid1.Columns[1] = dgTemplateColumn;
¿Alguna idea / consejo?
Debería especificar explícitamente el modo de enlace y activar la activación de su enlace. También use SetBinding
lugar de SetValue
:
var valueBinding = new Binding("AttachmentValue")
{
Mode = BindingMode.TwoWay,
UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged
};
newCombobox.SetBinding(ComboBox.SelectedValueProperty, valueBinding);
Esto debería permitirle obtener el valor seleccionado en los datos de su fila. Es posible que no se actualice en el valor de cuadrícula de datos que se muestra para la columna AttachmentValue
.