将DataGrid绑定到Collection <list> </list>

时间:2012-08-16 16:22:54

标签: wpf data-binding wpfdatagrid infragistics

DataGrid可以绑定Collection<List>类型吗?

关于将DataGrid绑定到Collection<Collection>有几个问题,它对我也有用。但是,我正在寻找DataGrid&lt; - Binding - &gt; Collection<List>


当我尝试时,List只是显示为DataGrid上的对象,如:

  

名称
   - System.Collections.Generic.List&#39; 1 [System.Int32]
    价值
       鲍勃         23
     43000
  + System.Collections.Generic.List&#39; 1 [System.Int32]


在这种情况下,ListCollection的区别如何?

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

实施例

Collection<List>
entry1包含List:&#34; Bob&#34;,23,43000和
entry2包含List:&#34; Alice&#34;,42,71000。

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

请注意,字符串Name,Age和Salary不是Lists的一部分。

<小时/>

我的计划

  1. 标题行绑定到List<String>,以获取DataGrid's标题中的列名。
  2. 剩余行绑定到Collection<List>以获取DataGrid中填充的数据。
  3. 特别是,我想知道我是否可以将这3个字符串(姓名,年龄,薪水)放在List<String>中并仅将标题行绑定到它。 DataGrid的其余行可以绑定到Collection。

    这可能吗?

    <小时/> 理想情况下,我想使用 Infragistics&#39; XamDataGrid,但DataGrid的任何解决方案都是一个很好的起点。

    <小时/>

    修改

    为什么我不使用Collection<Employee>? 我想在DataGrid

    中仅显示列的子集

    我有大约5个屏幕,显示2种EmployeeEmployeeDetails的列。这两种类型每种都有大约100种不同的属性,我只对在每个屏幕上显示大约20个属性作为列感兴趣。因此,我为每个仅包含这20个属性的List / Employee对象创建EmployeeDetails

    通过读取一些配置文件在运行时定义子集。因此,我无法静态定义我需要展示的内容。

2 个答案:

答案 0 :(得分:2)

可以使用绑定转换器来提取列表中的成员:

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;
}

......老实说,我不明白你想要达到的目标。您的字符串列表代表对象的属性,为什么不只使用Collection<Employee> Employee

public class Employee : INotifyPropertyChanged
{
    public string Bob
    {
        ...
    }

    public int Age
    {
        ...
    }

    public double Salary
    {
        ...
    }
}

强类型,更易读,更易于维护。


编辑:

阅读完编辑后:绝对不要使用List<string>。只是不要让您的XamDataGrid自动为每个字段生成一列。您还some examples了解如何隐藏列。


编辑:

方式更多MVVM友好来公开Collection<Employee>属性+编写一些代码,而不是公开Collection<List<string>>

请记住,XamDataGrid控件的限制是纯粹与MVVM模式的视图部分相关。 请勿更改ViewModel逻辑

此处还有一个相关问题可以提供帮助:XamDataGrid column visibilty is not working using MVVM

答案 1 :(得分:1)

这听起来不对。您在Collection中显示的项目只是具有属性的对象。为什么不拥有具有这些属性的对象集合?

为了迭代第二个列表,您需要绑定到该列表的绑定行中的另一个ItemsControl作为其数据源。否则,您将始终只接收System.Collections.Generic.List'1 [System.Int32]绑定值,因为这是正在迭代的当前级别。

如果你想保持它的通用性,你甚至可以绑定到Collection,允许对象定义它的属性,在Datagrid中,只绑定到它认为应该可见的属性(无论对象是否支持)。