DataGrid
可以绑定到Collection<List>
类型吗?
关于将DataGrid
绑定到Collection<Collection>
有几个问题,它也对我有用。但是,我正在寻找DataGrid
<-绑定--> Collection<List>
。
当我尝试时,List
只是在DataGrid
上显示为对象,例如:
名字
- System.Collections.Generic.List'1[System.Int32]
价值
鲍勃
23
43000
+ System.Collections.Generic.List'1[System.Int32]
在这种情况下,List
与Collection
有何不同?
List
没有条目的标识符,因此列表中的条目无法自动分组到DataGrid
中的列中。
例:
在Collection<List>
:entry1 包含List
:"Bob", 23, 43000 和
entry2 包含List
:"Alice", 42, 71000。
我是否可以使用List
的DataTemplate
来获得以下显示?
姓名 | 年龄 | 工资
鲍勃 | 23 | 43000
爱丽丝 | 42 | 71000
请注意,字符串名称、年龄和薪水不是Lists
的一部分。
我的计划
- 将标题行绑定到
List<String>
以获取DataGrid's
标题中的列名。 - 将剩余行绑定到
Collection<List>
以获取填充DataGrid
中的数据。
具体来说,我想知道我是否可以将这 3 个字符串(姓名、年龄、薪水)放在一个List<String>
中,并仅将标题行绑定到它。DataGrid
的其余行可以绑定到集合。
这可能吗?
理想情况下,我想使用Infragistics的
XamDataGrid
,但任何DataGrid
解决方案都将是一个很好的起点。
编辑
我为什么不使用Collection<Employee>
?我只想在DataGrid
中显示列的子集。
我有大约 5 个屏幕,显示 2 种类型的列 Employee
和 EmployeeDetails
.这两种类型都有大约 100 个不同的属性,我只对在每个屏幕上显示大约 20 个属性作为列感兴趣。因此,我为每个仅包含这 20 个属性的 Employee
/EmployeeDetails
对象创建一个List
。
子集是在运行时通过读取一些配置文件来定义的。因此,我无法静态定义我需要显示的内容。
可以使用绑定转换器提取列表的成员:
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value is List<string> && parameter is int)
{
return ((List<string>)value)[(int)parameter];
}
return null;
}
。但老实说,我不明白你想实现什么。您的字符串列表表示对象的属性,为什么不只使用Employee
所在的Collection<Employee>
public class Employee : INotifyPropertyChanged
{
public string Bob
{
...
}
public int Age
{
...
}
public double Salary
{
...
}
}
强类型,更具可读性,更易于维护。
编辑:
阅读您的编辑后:绝对不要使用List<string>
.只是不要要求 XamDataGrid 为每个字段自动生成一列。您还有一些有关如何隐藏列的示例。
编辑:
公开 Collection<Employee>
属性 + 在后面编写一些代码比公开 Collection<List<string>>
对 MVVM 更友好。
请记住,XamDataGrid 控件的限制纯粹与 MVVM 模式的视图部分有关。不要因此而更改 ViewModel 逻辑。
还有一个相关的问题可能会有所帮助:XamDataGrid 列可见性在使用 MVVM 时不起作用
听起来不对。 在集合中显示的项只是具有属性的对象。 为什么不只拥有具有这些属性的对象集合?
为了循环访问第二个列表,您需要绑定到该列表的绑定行内的另一个 ItemsControl 作为其数据源。 否则,您将始终只收到 System.Collections.Generic.List'1[System.Int32] 绑定值,因为这是正在迭代的当前级别。
如果要保持它的泛型,甚至可以绑定到集合,允许对象定义其属性,并在 Datagrid 中仅绑定到它认为应该可见的属性(无论对象是否支持)。