DataGridColumn与动态生成的数据绑定

时间:2012-06-14 15:35:41

标签: c# wpf dynamic binding datagrid

我有一大堆数据是从我的程序中的Web服务生成的。我需要在DataGrid中显示这些数据,但返回的数据集合都有不同的格式(一个可能是3列,下一个是7)所以我无法创建一个特定的对象来保存这些数据。我无法显示此信息。现在我正在尝试使用这种方法。我将数据放入KeyValuePairs的二维列表中。 Key是此数据所属的列,Value是该行的输出。这就是我现在正在尝试的。

private void SetDataValuesExecute(List<List<KeyValuePair<string,object>>> Data)
    {
        ResultsCollection = Data;
        ValuesDataGrid.Columns.Clear();
        foreach (string colName in Data[0].Select(x => x.Key).ToList())
        {
            DataGridTextColumn tempCol = new DataGridTextColumn();
            tempCol.Header = colName;
            Binding bind = new Binding();
            bind.Source = ResultsCollection.Select(x => x.FirstOrDefault(y => y.Key == colName).Value.ToString()).ToList();
            tempCol.Binding = bind;
            ValuesDataGrid.Columns.Add(tempCol);         
        }
    }

ResultsCollection是一个非易失性变量,可用作绑定源。它是我构建DataGrid所需的所有二维List数据的副本。

这将查看第一个条目,它提取Column Header值并根据该值创建新列。绑定语句查看每个Row,获取指定Column的数据,并尝试将其设置为Column的Binding。这允许我同时拥有列名和该列中所有数据的列表。不幸的是,将数据列表绑定到列最终不会显示任何数据。

所以我的问题是:我如何格式化数据以使列绑定实际显示数据?我接近这种情况都错了吗?任何帮助都表示赞赏,因为我很难过。

2 个答案:

答案 0 :(得分:3)

这是一个完整的工作样本

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        var data = new MyViewModel();

        int columnIndex = 0;

        foreach (var name in data.ColumnNames)
        {
            grid.Columns.Add(
                new DataGridTextColumn
                {
                    Header = name,
                    Binding = new Binding(
                        string.Format("Values[{0}]", columnIndex++))
                });
        }

        DataContext = data;
    }
}

public class MyViewModel
{
    public MyViewModel()
    {
        Items = new List<RowDataItem>
            {
                new RowDataItem(),
                new RowDataItem(),
                new RowDataItem(),
            };

        ColumnNames = new List<string>{ "Col 1", "Col 2", "Col 3"};
    }

    public IList<string> ColumnNames { get; private set; }

    public IList<RowDataItem> Items { get; private set; }
}

public class RowDataItem
{
    public RowDataItem()
    {
        Values = new List<string>{ "One", "Two", "Three"};    
    }

    public IList<string> Values { get; private set; }
}

Xaml

<Grid>
    <DataGrid x:Name="grid" ItemsSource="{Binding Items}" 
              AutoGenerateColumns="False"/>
</Grid>

答案 1 :(得分:0)

这是一个GridView,但它的工作原理。我认为你需要使用bind.Path,但是KVP不确定语法的其余部分。

WPF - Display Grid of Results With Dynamic Columns/Rows