Изменить значение ячейки в DataGrid с DataGridTemplateColumn, содержащая поле со списком
Я генерирую графический интерфейс редактирования динамически на основе определения XML. Одним из элементов управления является Tab Control с несколькими вкладками. Каждая вкладка содержит 1 DataGrid. DataGrid генерируется на основе столбцов/значений, доступных в определении. Каждый столбец представляет собой DataGridTemplateColumn, содержащий ComboBox или Textbox. Последний столбец-это столбец действий, содержащий кнопку. Я могу генерировать первую строку с данными, основанными на данных, доступных в коллекции. Проблема заключается в том, что когда я пытаюсь добавить новую строку, данные все еще являются старыми данными (как в выбранном значении ComboBox 1-й строки), а новые данные не выбраны. Вот этот код.
private DataGridTemplateColumn AddDataGridComboBoxColumn(XmlNodeList _childnodeList, string header, DataTable table, DataRow row , string data = "") { DataGridTemplateColumn column = new DataGridTemplateColumn(); if (!table.Columns.Contains(header)) { var comboTemplate = new FrameworkElementFactory(typeof(ComboBox)); List<string> items = new List<string>(); for (int count = 0; count < _childnodeList.Count; count++) { items.Add(_childnodeList.Item(count).InnerText.ToString()); } comboTemplate.SetValue(ComboBox.ItemsSourceProperty, items); comboTemplate.SetBinding(ComboBox.SelectedItemProperty, new Binding(data)); comboTemplate.SetValue(ComboBox.SelectedItemProperty, data); column.Header = header; column.CellTemplate = new DataTemplate() { VisualTree = comboTemplate }; column.CellEditingTemplate = new DataTemplate() { VisualTree = comboTemplate }; DataColumn dtcolumn = new DataColumn(); dtcolumn.Caption = header; dtcolumn.ColumnName = header; //dtcolumn.DataType = typeof(ComboBox); table.Columns.Add(dtcolumn); row[header] = items; } else column.SetCurrentValue(ComboBox.SelectedValueProperty, data); return column; } private DataGrid CreatedRepeatingGroupDataGrid(XmlNodeList _childnodeList, string data) { DataTable table = new DataTable(); dgRepeatingGroups = new DataGrid(); dgRepeatingGroups.AutoGenerateColumns = false; dgRepeatingGroups.CanUserAddRows = true; dgRepeatingGroups.CanUserDeleteRows = true; dgRepeatingGroups.HorizontalAlignment = HorizontalAlignment.Left; if (data != "") { string[] arrayofRowdata = data.Split(System.Environment.NewLine.ToCharArray()); for (int i = 0; i < arrayofRowdata.Length; i++) { if (arrayofRowdata[i] != "") { if (i == 0) { DataRow row = table.NewRow(); foreach (XmlNode _node in _childnodeList) { string id = _node.Attributes.Item(0).Value; string labelchild = _node.Attributes.Item(1).Value; string type = _node.Attributes.Item(2).Value; string datavalue = string.Empty; string[] arrayofdata = arrayofRowdata[i].Split(';'); for (int i1 = 0; i1 < arrayofdata.Length; i1++) { if (arrayofdata[i1].Contains(labelchild.Replace(".", ""))) { datavalue = arrayofdata[i1].Replace(" " + labelchild.Replace(".", "") + " : ", "").ToString().TrimEnd(' '); break; } } if (type.ToUpper() == "DECIMAL" || type.ToUpper() == "STRING") { dgRepeatingGroups.Columns.Add(AddDataGridTextColumn(labelchild, table, row, datavalue)); } else if (type.ToUpper() == "COMBO") { dgRepeatingGroups.Columns.Add(AddDataGridComboBoxColumn(_node.ChildNodes, labelchild, table, row, datavalue)); //dgRepeatingGroups.Columns.Add(AddDGComboBoxColumn(_node.ChildNodes, labelchild, table, row)); } else if (type.ToUpper() == "DATE") { dgRepeatingGroups.Columns.Add(AddDataGridDatePickerColumn(labelchild, "datepicker", table, row, datavalue)); } } } else { DataRow row = table.NewRow(); table.Rows.InsertAt(row, table.Rows.Count); foreach (XmlNode _node in _childnodeList) { string id = _node.Attributes.Item(0).Value; string labelchild = _node.Attributes.Item(1).Value; string type = _node.Attributes.Item(2).Value; string datavalue = string.Empty; string[] arrayofdata = arrayofRowdata[i].Split(';'); for (int i1 = 0; i1 < arrayofdata.Length; i1++) { if (arrayofdata[i1].Contains(labelchild.Replace(".", ""))) { datavalue = arrayofdata[i1].Replace(" " + labelchild.Replace(".", "") + " : ", "").ToString().TrimEnd(' '); break; } } //datavalue is hold value of selectedvalue for each combobox and text for each textbox. row[labelchild] = datavalue; } } } } else { DataRow row = table.NewRow(); foreach (XmlNode _node in _childnodeList) { string id = _node.Attributes.Item(0).Value; string labelchild = _node.Attributes.Item(1).Value; string type = _node.Attributes.Item(2).Value; string datavalue = string.Empty; string[] arrayofdata = data.Split(';'); for (int i1 = 0; i1 < arrayofdata.Length; i1++) { if (arrayofdata[i1].Contains(labelchild.Replace(".", ""))) { datavalue = arrayofdata[i1].Replace(" " + labelchild.Replace(".", "") + " : ", "").ToString().TrimEnd(' '); break; } } if (type.ToUpper() == "DECIMAL" || type.ToUpper() == "STRING") { dgRepeatingGroups.Columns.Add(AddDataGridTextColumn(labelchild, table, row, datavalue)); } else if (type.ToUpper() == "COMBO") { dgRepeatingGroups.Columns.Add(AddDataGridComboBoxColumn(_node.ChildNodes, labelchild, table, row, datavalue)); //dgRepeatingGroups.Columns.Add(AddDGComboBoxColumn(_node.ChildNodes, labelchild, table, row)); } else if (type.ToUpper() == "DATE") { dgRepeatingGroups.Columns.Add(AddDataGridDatePickerColumn(labelchild, "datepicker", table, row, datavalue)); } } } dgRepeatingGroups.Columns.Add(AddDataGridAddActionButtonColumn("Add Group", table)); //dgRepeatingGroups.Columns.Add(AddDataGridRemoveActionButtonColumn("Remove Group", table, row)); dgRepeatingGroups.Background = new SolidColorBrush(Colors.LightSkyBlue); dgRepeatingGroups.AlternatingRowBackground = new SolidColorBrush(Colors.LightCyan); table.AcceptChanges(); dgRepeatingGroups.ItemsSource = table.DefaultView; return dgRepeatingGroups; }
Если я получу ответ на то, как изменить выбранное значение ComboBox, генерируемое через DataGridTemplateColumn во второй строке, даже это будет большим подспорьем...