WPF Datagrid以编程方式在类中添加列绑定

时间:2018-03-17 16:32:45

标签: c# wpf binding datagrid

我有一个Employee课程:

class Employee
{
        public string Name { get; set; }
        public string SurName { get; set; }
        public int Rest{ get; set; }
        public int  Worked { get; set; }
        public List<int> PerShift= new List<int>(); 
}

在我的数据库中,我保存一名员工在第一班工作多少次,第二班等多少次。然后在我的数据网格中,我想看看每位员工总共工作多少次,他休息多少天以及多少天他每班工作几天。问题是移位号是由用户设置的,所以我必须以编程方式添加这些列

<DataGrid Name="EmployeesStatsDatagrid"
          Grid.Row="1"
          IsReadOnly="True"
          CanUserAddRows="False" CanUserReorderColumns="False"
          Grid.ColumnSpan="4"
          Grid.Column="0"
          IsSynchronizedWithCurrentItem="True"
          CanUserDeleteRows="False"
          CanUserResizeRows="False"
          AutoGenerateColumns="False"
          VerticalAlignment="Stretch">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Name" Binding="{Binding Name}" />
        <DataGridTextColumn Header="Surname" Binding="{Binding SureName}" />
        <DataGridTextColumn Header="Rest" Binding="{Binding Rest}" />
        <DataGridTextColumn Header="Δούλεψε" Binding="{Binding Worked}" />
    </DataGrid.Columns>
</DataGrid>

然后我添加额外的列

for (int i = 0; i < Collections.ShiftsCollection.Count; i++)
{
    DataGridTextColumn textColumn = new DataGridTextColumn();
    textColumn.Header = Collections.ShiftsCollection[i].ShiftName.ToUpper();
    //textColumn.Binding = new Binding(Collections.ShiftsCollection[i].ShiftName);
    EmployeesStatsDatagrid.Columns.Add(textColumn);
}

列已正确设置,我创建了一个Employee列表和绑定工作名称,姓氏,工作和休息,但如何将额外列绑定到List<int> PerShift?有任何想法吗?或者我应该以不同的方式实施它?

enter image description here

例如,在这种情况下,我有两个班次,上午和下午,第一个员工PerShift列表是{4,0},第二个是{0,1}有没有办法让列中的这些值绑定?我在这种情况下对它们进行了硬编码,但如果我对列进行排序,则会丢失值。

1 个答案:

答案 0 :(得分:1)

您可以使用ExpandoObject。以相同的方式添加多余的列,然后按如下所示创建DataGrid.ItemsSource对象列表:

        var all_items = new List<object>();

        for (int i = 0; i <= MyData.Count-1; i++)
        {
            dynamic item = new System.Dynamic.ExpandoObject();
            item.Name = MyData[i].Name;
            item.Surname = MyData[i].Surname;
            item.Rest = MyData[i].Rest;
            item.Worked = MyData[i].Worked;
            
            for (int k = 0; k <= Collections.ShiftsCollection.Count - 1; k++)
            {
                item = ExtendExpando(item, Collections.ShiftsCollection[k].ShiftName, Collections.ShiftsCollection[k].Value);
                // or whatever corresponding value instead of Collections.ShiftsCollection[k].Value
            }

            all_items.Add(item);
        }

        EmployeesStatsDatagrid.ItemsSource = all_items;

其中ExtendExpando函数可以按以下方式实现:

public static object ExtendExpando(object OldExpandoObject, string NewProperty, object NewValue)
    {
        var ex = (IDictionary<string, object>)OldExpandoObject;
        ex.Add(new KeyValuePair<string, object>(NewProperty, NewValue));
        dynamic output = ex;
        return output;
    }

注意:我已使用Visual Basic而非C#成功测试了此代码,您可能需要进行一些小的修改。