c# - DataGridColumn 与动态生成的数据绑定(bind)

标签 c# wpf dynamic binding datagrid

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

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 是一个非 volatile 变量,用作我的绑定(bind)源。它是我构建 DataGrid 所需的所有二维列表数据的副本。

这会查看第一个条目,提取列标题值并基于该值创建新列。绑定(bind)语句查看每一行,抓取指定列的数据,并尝试将其设置为列的绑定(bind)。这使我能够同时拥有列名称和该列中所有数据的列表。不幸的是,将数据列表绑定(bind)到列最终不会显示任何数据。

所以我的问题是:我需要如何格式化数据才能使列绑定(bind)实际显示数据?我对这种情况的处理完全错误吗?感谢任何帮助,因为我很困惑。

最佳答案

这是一个完整的工作示例

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>

关于c# - DataGridColumn 与动态生成的数据绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11036533/

相关文章:

c# - 在 C# 中解析 json w 变量键值对

c# - NHibernate Aurora (MySQL) 中键 'XXX' 的重复条目 'PRIMARY'

java - 为什么 0.0f/0.0f 不产生任何运行时错误?

c# - MVVM 如何将 ListBox SelectedItem 放入 ViewModel 中的类的实例中

c# - WPF 使用附加属性和行为执行 ICommand

c# - 将 var 作为 T 参数传递

c# - 什么是 C# 6.0 #pragma disable 警告功能?

c# - 将 CollectionViewSource 与 GroupDescriptions 一起使用时的 ListBox ScrollIntoView(即 IsGrouping == True)

ios - 如何使用 Autolayout 确保干净地堆叠多个动态 UIView

c# - 如何在 C# 中使用 RestSharp 反序列化动态 json 属性?