【问题标题】:How to get value of a programmatically written combobox in a datagrid in wpf?如何在 wpf 的数据网格中获取以编程方式编写的组合框的值?
【发布时间】:2018-02-02 02:18:07
【问题描述】:

在这里关注我之前的帖子 => Binding SelectedItem of ComboBox in DataGrid with different type

我现在有一个包含 2 列的数据网格,一列带有文本,另一列带有组合框(在数据模板中,通过 C# 代码而不是 Xaml 编写)。

在对组合框做了一些选择之后,我现在想解析结果,但包含我的组合框的单元格的值保持为空:

foreach(DataRowView row in Datagrid1.Items)
{
var firstColumNresult = row.Row.ItemArray[0];// Return correctly a string
var myrow = row.Row.ItemArray[1];// always empty... 
}

结果是我无法获取我(之前生成的)组合框的值。

我想一个绑定一定错过了某个地方......

这是组合框的创建代码:

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;

有什么想法/建议吗?

【问题讨论】:

  • 你为什么这样做?我的意思是用 C# 而不是 XAML 创建元素?
  • 我不明白你是如何在循环中达到 always null 的。对我来说,datagrid1.Items不是DataRowView的集合,所以会更早抛出。
  • Foggy => 我首先动态创建列,检查或不检查 CheckBox,列名不同,这就是我选择这个解决方案的原因
  • grek40 => row 不是空的,但是 row.Row.ItemArray[1] 是 => 代表生成的comboBox。
  • 这就像我的组合框的选定值没有存储在任何地方......

标签: c# xaml parsing datagrid datagridtemplatecolumn


【解决方案1】:

您应该明确指定绑定的绑定模式和更新触发器。也用SetBinding代替SetValue

var valueBinding = new Binding("AttachmentValue")
{
    Mode = BindingMode.TwoWay,
    UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged
};
newCombobox.SetBinding(ComboBox.SelectedValueProperty, valueBinding);

这应该使您能够将所选值放入您的行数据中。它可能不会在 AttachmentValue 列的显示数据网格值中更新。

【讨论】:

    猜你喜欢
    • 2020-03-08
    • 2011-08-13
    • 1970-01-01
    • 2013-10-05
    • 2011-06-29
    • 1970-01-01
    • 1970-01-01
    • 2016-10-18
    • 1970-01-01
    相关资源
    最近更新 更多