C# 将DataGrid单元格绑定到索引属性
我已经在一个类中创建了一个索引属性,我需要为C# 将DataGrid单元格绑定到索引属性,c#,wpf,xaml,data-binding,datagrid,C#,Wpf,Xaml,Data Binding,Datagrid,我已经在一个类中创建了一个索引属性,我需要为DataGrid中的DataGridTemplateColumn的每个单元格设置绑定(每个单元格对应于索引属性的相应项) 它用于生成工作计划的应用程序。网格中的每个单元格将显示与员工和班次相关的数据-班次中的更多员工将向右扩展网格,即添加更多列。网格显示以编程方式创建和填充的数据结构,而不是绑定到数据库表。为了便于在本论坛中进行演示和代码检查,我将所有内容简化为基本内容 这是一张照片: 这显然是错误的,因为我无法正确设置绑定。我可以将StackPan
DataGrid
中的DataGridTemplateColumn
的每个单元格设置绑定(每个单元格对应于索引属性的相应项)
它用于生成工作计划的应用程序。网格中的每个单元格将显示与员工和班次相关的数据-班次中的更多员工将向右扩展网格,即添加更多列。网格显示以编程方式创建和填充的数据结构,而不是绑定到数据库表。为了便于在本论坛中进行演示和代码检查,我将所有内容简化为基本内容
这是一张照片:
这显然是错误的,因为我无法正确设置绑定。我可以将StackPanel中的字段绑定到索引属性的第一个(或任何其他)项,但不能在索引/参数化设置中绑定
这是我的xaml(部分):
以及生成列的代码:
private void Page_Loaded(object sender, RoutedEventArgs e)
{
// Create the grid columns
DataGridTemplateColumn col = new DataGridTemplateColumn();
col.Header = "Shift";
col.CellTemplate = (DataTemplate)FindResource("SPI_Template");
grdSch.Columns.Add(col);
for (int i = 0; i < 30; i++)
{
col = new DataGridTemplateColumn();
col.Header = "Employee " + (i + 1);
col.Width = 100;
col.CellTemplate = (DataTemplate)FindResource("SEI_Template");
// for now show only the 5 first elements
col.Visibility = i >= 5 ? Visibility.Hidden : Visibility.Visible;
grdSch.Columns.Add(col);
}
}
private void页面\u已加载(对象发送方,路由目标)
{
//创建网格列
DataGridTemplateColumn=新DataGridTemplateColumn();
col.Header=“Shift”;
col.CellTemplate=(数据模板)FindResource(“SPI_模板”);
grdSch.Columns.Add(列);
对于(int i=0;i<30;i++)
{
col=新的DataGridTemplateColumn();
col.Header=“Employee”+(i+1);
柱宽=100;
col.CellTemplate=(数据模板)FindResource(“SEI_模板”);
//现在只显示前5个元素
col.Visibility=i>=5?可见性。隐藏:可见性。可见;
grdSch.Columns.Add(列);
}
}
data[]
属性被索引。现在的绑定(例如“{Binding Path=data[0].emplName}”
)适用于属性的第一项。如果我将其更改为“{Binding Path=data[1].empname}”
,它将绑定到第二个,依此类推。但这当然不是我需要的。有没有办法将绑定更改为<代码>“{Binding Path=data[Grid.ColumnIndex-1].emplName}”?搜索并找到了一些关于“参数化绑定”等的帖子,但找不到非常明显或直接的东西。当然,我可以不择手段地在xaml中添加30个类似的模板(只在索引属性的索引上有所不同)——这肯定会奏效,但我正在寻找一种更好的方法
有人能帮忙吗
提前感谢您一种解决方案是创建自定义列类型(源自
DataGridTemplateColumn
),它公开了一个额外的绑定
属性,我们将使用该属性绑定单元格内容。以下是列代码:
public class DataGridBoundColumn : DataGridTemplateColumn
{
public BindingBase Binding { get; set; }
protected override FrameworkElement GenerateEditingElement(DataGridCell cell, object dataItem)
{
var element = base.GenerateEditingElement(cell, dataItem);
if (element != null && Binding != null)
element.SetBinding(ContentPresenter.ContentProperty, Binding);
return element;
}
protected override FrameworkElement GenerateElement(DataGridCell cell, object dataItem)
{
var element = base.GenerateElement(cell, dataItem);
if (element != null && Binding != null)
element.SetBinding(ContentPresenter.ContentProperty, Binding);
return element;
}
}
然后我们需要稍微修改列生成代码:
private void Page_Loaded(object sender, RoutedEventArgs e)
{
var col = new DataGridTemplateColumn
{
Header = "Shift",
CellTemplate = (DataTemplate)FindResource("SPI_Template")
};
grdSch.Columns.Add(col);
for (int i = 0; i < 30; i++)
{
col = new DataGridBoundColumn
{
Header = "Employee " + (i + 1),
Binding = new Binding($"data[{i}]"),
Width = 100,
CellTemplate = (DataTemplate)FindResource("SEI_Template"),
};
grdSch.Columns.Add(col);
}
}
非常非常感谢!按照您的建议更改了代码,它可以正常工作。因此,基本上是将单元格直接绑定到索引属性的每个项,而不是将xaml中的绑定设置为索引元素。这就是我想要的,但是你的解决方案是有效的,因此非常好。再次感谢!
private void Page_Loaded(object sender, RoutedEventArgs e)
{
var col = new DataGridTemplateColumn
{
Header = "Shift",
CellTemplate = (DataTemplate)FindResource("SPI_Template")
};
grdSch.Columns.Add(col);
for (int i = 0; i < 30; i++)
{
col = new DataGridBoundColumn
{
Header = "Employee " + (i + 1),
Binding = new Binding($"data[{i}]"),
Width = 100,
CellTemplate = (DataTemplate)FindResource("SEI_Template"),
};
grdSch.Columns.Add(col);
}
}
<DataTemplate x:Key="SEI_Template">
<StackPanel>
<TextBlock Text="{Binding emplName}" />
<TextBlock Text="{Binding shftDate}" />
</StackPanel>
</DataTemplate>