我试图在WPF数据网格中显示查询的结果.我绑定的ItemsSource类型是IEnumerable<dynamic>.由于返回的字段直到运行时才确定,因此在评估查询之前我不知道数据的类型.每个"行"都返回为ExpandoObject具有表示字段的动态属性.
我希望AutoGenerateColumns(如下所示)能够从ExpandoObject静态类型生成列,但它似乎不会.
<DataGrid AutoGenerateColumns="True" ItemsSource="{Binding Results}"/>
Run Code Online (Sandbox Code Playgroud)
无论如何要以声明方式执行此操作,还是必须使用某些C#进行必要的操作?
编辑
好的,这会给我正确的列:
// ExpandoObject implements IDictionary<string,object>
IEnumerable<IDictionary<string, object>> rows = dataGrid1.ItemsSource.OfType<IDictionary<string, object>>();
IEnumerable<string> columns = rows.SelectMany(d => d.Keys).Distinct(StringComparer.OrdinalIgnoreCase);
foreach (string s in columns)
dataGrid1.Columns.Add(new DataGridTextColumn { Header = s });
Run Code Online (Sandbox Code Playgroud)
所以现在只需要弄清楚如何将列绑定到IDictionary值.
这是解释我的问题的基本示例.让我说我有
ObservableCollection<int> Numbers {get; set;}
Run Code Online (Sandbox Code Playgroud)
和一个返回Numbers之和的IValueConverter.
通常我要做的是将IValueConverter更改为IMultiValueConverter并将第二个值绑定到Numbers.Count,就像这样
<MultiBinding Converter="{StaticResource SumTheIntegersConverter}">
<Binding Path="Numbers" />
<Binding Path="Numbers.Count" />
</MultiBinding>
Run Code Online (Sandbox Code Playgroud)
但是我无法使用此方法来解决我的实际问题.似乎应该有一个更好的方法来更新绑定,当集合发生变化,我只是没想到.在将项目添加到Numbers并将其删除时,将值转换器运行的最佳方法是什么?
我做了一个CollectionToStringConverter可以将任何转换IList成逗号分隔的字符串(例如"Item1,Item2,Item3").
我这样使用它:
<TextBlock Text="{Binding Items,
Converter={StaticResource CollectionToStringConverter}}" />
Run Code Online (Sandbox Code Playgroud)
上面的工作,但只有一次我加载UI.Items是一个ObservableCollection.文本块不会更新,并且在添加或删除时不会调用转换器Items.
知道缺少什么使这项工作?