如何将Dapper查询结果绑定到WPF DataGrid

Set*_*eno 7 .net c# data-binding wpf dapper

这是我的代码.它生成具有正确行数的绑定网格,但单元格为空.

XAML

<DataGrid
  Name="grid" 
  ItemsSource="{Binding}"
  AutoGenerateColumns="True" />
Run Code Online (Sandbox Code Playgroud)

代码背后

grid.DataContext = cn.Query("select * from SomeTable");
Run Code Online (Sandbox Code Playgroud)

McG*_*gle 5

文档中,您的语法cn.Query("sql")- 返回动态类型对象列表(IEnumerable<dynamic>).这对于DataGrid自动列不起作用,后者查找具体成员生成其列.我建议为SomeTable创建一个简单的实体类来映射属性然后使用cn.Query<SomeTableEntity>("select * from SomeTable");.


Set*_*eno 5

所以我猜答案是:这是不可能的.这是一个hacky解决方法.

        ...
        var items = cn.Query("select * from SomeTable");
        grid.DataContext = ConvertToDataTable(items);
    }

    public DataTable ConvertToDataTable(IEnumerable<dynamic> items) {
        var t = new DataTable();
        var first = (IDictionary<string, object>)items.First();
        foreach (var k in first.Keys)
        {
            var c = t.Columns.Add(k);
            var val = first[k];
            if (val != null) c.DataType = val.GetType();
        }

        foreach (var item in items)
        {
            var r = t.NewRow();
            var i = (IDictionary<string, object>)item;
            foreach (var k in i.Keys)
            {
                var val = i[k];
                if (val == null) val = DBNull.Value;
                r[k] = val;
            }
            t.Rows.Add(r);
        }
        return t;
    }
Run Code Online (Sandbox Code Playgroud)