相关疑难解决方法(0)

如何在WPF DataGrid中动态生成列?

我试图在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值.

wpf datagrid dynamic expandoobject

31
推荐指数
2
解决办法
5万
查看次数

如何在CollectionChanged上更新IValueConverter?

这是解释我的问题的基本示例.让我说我有

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并将其删除时,将值转换器运行的最佳方法是什么?

data-binding wpf inotifycollectionchanged

5
推荐指数
1
解决办法
3277
查看次数

为什么在Collection更改时不调用Converter?

我做了一个CollectionToStringConverter可以将任何转换IList成逗号分隔的字符串(例如"Item1,Item2,Item3").

我这样使用它:

<TextBlock Text="{Binding Items, 
                  Converter={StaticResource CollectionToStringConverter}}" />
Run Code Online (Sandbox Code Playgroud)

上面的工作,但只有一次我加载UI.Items是一个ObservableCollection.文本块不会更新,并且在添加或删除时不会调用转换器Items.

知道缺少什么使这项工作?

data-binding wpf

4
推荐指数
1
解决办法
3496
查看次数