将具有动态长度的数组绑定到DataGrid

时间:2017-03-10 01:00:55

标签: c# wpf data-binding wpfdatagrid

我有以下课程

public class User {
    public string Name { get; set; }
    public string[] InDateTimes { get; set; }
    public string[] OutDateTimes { get; set; }
}

我正在尝试将其绑定到数据网格,使其看起来像

+------+-----+------+-----+-----+----
| Name | In  | Out  | In  | Out | ...
+------+-----+------+-----+-----+----
|  U1  | 7am | 10am | 1pm | --- | ... //2-In, 1-Out, cells with no values filled with ---
+------+-----+------+-----+-----+----
|  U2  | 8am | 12pm | --- | --- | ... //1-In, 1-Out

现在,In / Out列的数量是动态的,取决于User InDateTimes的最大数量。并且OutDateTimes将始终等于或小于InDateTimes

的数量

现在我已经通过在我的自定义DataGrid课程中使用以下内容解决了这个问题。

public void AddColumn(string header, string bindingKey, double width = 100) {
    DataGridTextColumn column = new DataGridTextColumn();
    column.Header = header;
    column.Binding = new Binding() { Path = new PropertyPath(bindingKey), FallbackValue = "---" };
    column.Width = width;
    this.Columns.Add(column);
}

public void AddInOutColumn(int i) {
    AddColumn("In", $"InDateTimes[{i}]");
    AddColumn("Out", $"OutDateTimes[{i}]");
}

现在我的问题是,因为User可能有任意数量的进/出时间,有些会比其他有更多,这会导致那些有较少的进出。对于每个索引超出范围,我的控制台中会出现以下内容。

  

System.Windows.Data警告:17:无法从'InDateTimes'获取'Item []'值(类型'String')(类型'String []')。 BindingExpression:路径= InDateTimes [1]; DataItem ='User'(HashCode = 44145147); target元素是'TextBlock'(Name =''); target属性为'Text'(类型'String')ArgumentOutOfRangeException:'System.ArgumentOutOfRangeException:指定的参数超出有效值范围。

     

参数名称:index'

现在,这不会导致任何错误或阻止使用应用程序,因为它仍然可以正确显示数据,但我不希望每次绘制行时都会显示这些警告。

我也尝试从string[]更改为List<string>,以便我可以这样绑定。

$"InDateTimes.ElementAtOrDefault({i})"

但我得到以下内容,并且没有值显示在单元格中。

  

System.Windows.Data警告:40:BindingExpression路径错误:'object'''List`1'(HashCode = 7471720)'上找不到'ElementAtOrDefault(0)'属性。 BindingExpression:路径= InDateTimes.ElementAtOrDefault(0); DataItem ='User'(HashCode = 46045674); target元素是'TextBlock'(Name =''); target属性是'Text'(类型'String')

有解决方法吗?

0 个答案:

没有答案