Wpf 将DataGrid绑定到集合<;列表>;
Wpf 将DataGrid绑定到集合<;列表>;,wpf,data-binding,wpfdatagrid,infragistics,Wpf,Data Binding,Wpfdatagrid,Infragistics,DataGrid是否可以绑定到集合类型 将数据网格绑定到集合有几个问题,这对我来说也有点奏效。但是,我专门寻找DataGridCollection 当我尝试时,列表只是作为对象显示在数据网格上,如下所示: 名称 -System.Collections.Generic.List'1[System.Int32] 值 鲍勃 23 43000 +System.Collections.Generic.List'1[System.Int32] 在这种情况下,列表与集合有何不同? 列表没有条目标识符,因此
DataGrid
是否可以绑定到集合
类型
将数据网格
绑定到集合
有几个问题,这对我来说也有点奏效。但是,我专门寻找DataGrid
Collection
当我尝试时,
列表
只是作为对象显示在数据网格
上,如下所示:
名称-System.Collections.Generic.List'1[System.Int32]
值
鲍勃
23
43000
+System.Collections.Generic.List'1[System.Int32]
在这种情况下,
列表
与集合
有何不同?
列表
没有条目标识符,因此列表中的条目不能自动分组到数据网格
中的列中
例子:
在集合中
:条目1包含
列表
:“Bob”,2343000和条目2包含
列表
:“Alice”,4271000
我是否能够将数据模板
用于列表
以获得以下显示姓名|年龄|工资
鲍勃| 23 | 43000
爱丽丝| 42 | 71000 请注意,字符串Name、Age和Salary不属于
列表的一部分。
我的计划
将标题行绑定到列表
以获取数据网格标题中的列名
将剩余的行绑定到集合
,以获取在数据网格中填充的数据
具体地说,我想知道是否可以将这3个字符串(姓名、年龄、薪水)放在列表中
并仅绑定标题行。DataGrid
的其余行可以绑定到集合
这可能吗?
理想情况下,我希望使用Infragistics的XamDataGrid
,但是DataGrid
的任何解决方案都将是一个很好的起点
编辑
为什么我不使用集合
?
我只想在DataGrid
中显示列的子集
我有大约5个屏幕,显示两种类型的列Employee
和EmployeeDetails
。这两种类型都有大约100个不同的属性,我只想在每个屏幕上显示大约20个属性作为列。因此,我正在为每个员工
/员工详细信息
对象创建一个列表
,该对象仅包含这20个属性
子集是在运行时通过读取一些配置文件来定义的。因此,我不能静态地定义我需要显示的内容。这听起来不正确。在集合中显示的项目只是具有属性的对象。为什么不只是拥有一个具有这些属性的对象集合呢
为了迭代第二个列表,您需要在绑定到该列表的绑定行中使用另一个ItemsControl作为其数据源。否则,您将始终只接收System.Collections.Generic.List的1[System.Int32]绑定值,因为这是正在迭代的当前级别
如果希望使其保持通用性,甚至可以绑定到集合,允许对象定义其属性,并在Datagrid中,仅绑定到它认为应该可见的属性(无论对象是否支持) 您可以使用绑定转换器提取列表中的成员:
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;
}
强类型、可读性更强、可维护性更强
编辑:
阅读编辑后:绝对不要使用列表
。只是不要要求XamDataGrid为每个字段自动生成一列。您还了解了如何隐藏列
编辑:
与公开集合相比,公开集合
属性并在其后面编写一些代码对MVVM友好得多
请记住,XamDataGrid控件的限制仅与MVVM模式的视图部分相关不要因此更改ViewModel逻辑
还有一个相关的问题可能会有所帮助:当我考虑您的答案时,请参阅编辑,了解我为什么不使用集合
。此外,子集是在运行时通过读取一些配置文件定义的。因此,我无法静态定义需要显示的内容。@user640378如果需要,您可以在运行时动态隐藏列(参见示例),感谢您的更新。动态隐藏列的问题是我需要使用XamDataGrid
的FieldLayout
。这将要求我在代码背后有代码;我正在研究MVVM样式的方法。关闭列的自动生成,您就不必担心“创建列的子集”。您只需定义要显示的内容,这就是显示的内容。子集是在运行时通过读取一些配置文件来定义的。因此,我不能静态地定义我需要显示的内容。
public class Employee : INotifyPropertyChanged
{
public string Bob
{
...
}
public int Age
{
...
}
public double Salary
{
...
}
}