Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将DataGrid单元格绑定到索引属性_C#_Wpf_Xaml_Data Binding_Datagrid - Fatal编程技术网

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>