gpt4 book ai didi

c# - DataGridTemplateColumns、AutoGenerateColumns=true 并绑定(bind)到 DataTable

转载 作者:行者123 更新时间:2023-11-30 14:57:37 25 4
gpt4 key购买 nike

我正在为一系列问题而苦苦挣扎。

  1. 我有一个动态数据集,我手动将其组装到 DataTable 中。
  2. 我必须自动生成列,因为数据不是静态的。
  3. 我需要将组合框的 ItemsSource 绑定(bind)到每个单元格中定义的 Observable 集合。

虽然我认为这很容易,但 ComboBox 看不到 DataView 中的 DataItem,而是尝试直接绑定(bind)到 DataView。

我在这里整理了一个示例项目:

https://github.com/5flags/DataGridBindingIssue

现在,它显然是设计来演示这个问题的。此时我无法更改数据结构,因此任何解决方案都必须在 XAML 中完成。

要查看问题,请使用 Snoop(或等效工具)查看 ComboBox 上的绑定(bind)错误。

DataGrid 的设置如下:

<DataGrid AutoGenerateColumns="True" AutoGeneratingColumn="DataGrid_OnAutoGeneratingColumn" CanUserAddRows="False" x:Name="TheDataGrid" ItemsSource="{Binding Data}">
<DataGrid.Resources>
<DataTemplate x:Key="dataItemCellTemplate">
<ComboBox SelectedValue="{Binding Path=SelectedOption, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
ItemsSource="{Binding Options}"/>
</DataTemplate>
</DataGrid.Resources>
</DataGrid>

自动生成的事件处理程序是:

private void DataGrid_OnAutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
if (e.PropertyType == typeof(string))
{
var col = new DataGridTextColumn {Binding = new Binding(e.PropertyName), Header = e.PropertyName};
e.Column = col;
}
else if (e.PropertyType == typeof(DataItem))
{
var col = new DataGridTemplateColumn
{
CellTemplate = (DataTemplate) TheDataGrid.FindResource("dataItemCellTemplate"),
CellEditingTemplate = (DataTemplate)TheDataGrid.FindResource("dataItemCellTemplate"),
Header = e.PropertyName
};
e.Column = col;
}
}

组合上的绑定(bind)错误是:

System.Windows.Data 错误:40:BindingExpression 路径错误:在“对象”“DataRowView”(HashCode=22264221) 上找不到“选项”属性。绑定(bind)表达式:路径=选项; DataItem='DataRowView' (HashCode=22264221);目标元素是 'ComboBox' (Name='');目标属性是“ItemsSource”(类型“IEnumerable”)

System.Windows.Data 错误:40:BindingExpression 路径错误:在“对象”“DataRowView”(HashCode=22264221) 上找不到“SelectedOption”属性。绑定(bind)表达式:Path=SelectedOption; DataItem='DataRowView' (HashCode=22264221);目标元素是 'ComboBox' (Name='');目标属性是“SelectedValue”(类型“Object”)

最佳答案

Dusan 的回答让我走上了正确的道路。因为直到运行时我才知道列名,所以我也必须在运行时创建数据模板。其实并不难。

private DataTemplate GetDataTemplate(string columnName)
{
string xaml = "<DataTemplate><ComboBox SelectedValue=\"{Binding Path=[" + columnName +
"].SelectedEnumeratedElementItem, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}\"" +
" ItemsSource=\"{Binding Path=[" + columnName +
"].Items}\" DisplayMemberPath=\"Name\"/></DataTemplate>";

var sr = new MemoryStream(Encoding.ASCII.GetBytes(xaml));
var pc = new ParserContext();
pc.XmlnsDictionary.Add("", "http://schemas.microsoft.com/winfx/2006/xaml/presentation");
pc.XmlnsDictionary.Add("x", "http://schemas.microsoft.com/winfx/2006/xaml");
var datatemplate = (DataTemplate)XamlReader.Load(sr, pc);

return datatemplate;
}

关于c# - DataGridTemplateColumns、AutoGenerateColumns=true 并绑定(bind)到 DataTable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20493184/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com