将数据网格绑定到集合<List>



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]


在这种情况下,ListCollection有何不同?

List没有条目的标识符,因此列表中的条目无法自动分组到DataGrid中的列中。

例:

Collection<List>
:entry1 包含List:"Bob", 23, 43000 和
entry2 包含List:"Alice", 42, 71000。

我是否可以使用ListDataTemplate来获得以下显示?
姓名 | 年龄 | 工资
鲍勃 | 23 | 43000
爱丽丝 | 42 | 71000

请注意,字符串名称、年龄和薪水不是Lists的一部分。


我的计划

  1. 标题行绑定到List<String>以获取DataGrid's标题中的列名。
  2. 剩余行绑定到Collection<List>以获取填充DataGrid中的数据。

具体来说,我想知道我是否可以将这 3 个字符串(姓名、年龄、薪水)放在一个List<String>中,并仅将标题行绑定到它。DataGrid的其余行可以绑定到集合。

这可能吗?


理想情况下,我想使用Infragistics的XamDataGrid,但任何DataGrid解决方案都将是一个很好的起点。


编辑

我为什么不使用Collection<Employee>?我只想在DataGrid中显示列的子集

我有大约 5 个屏幕,显示 2 种类型的列 EmployeeEmployeeDetails .这两种类型都有大约 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 中仅绑定到它认为应该可见的属性(无论对象是否支持)。

相关内容

  • 没有找到相关文章

最新更新