我有以下课程
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')
有解决方法吗?