当AutoGenerateColumns = False时,WPF DataGrid ItemsSource中的项目形状

问题描述

|| 当我使用WPF DataGrid时(我认为SL版本的工作原理类似),并且在运行时指定了列(即,在编译时不知道它们,因此无法通过反射自动生成列) 如何提供项目,以使其正确显示在网格中?换句话说,给定以下DataGrid:
<DataGrid x:Name=\"dataGrid\" AutoGenerateColumns=\"False\">
  <DataGrid.Columns>
    <DataGridTextColumn Header=\"Foo\"/>
    <DataGridTextColumn Header=\"Bar\"/>
    <DataGridTextColumn Header=\"Baz\"/>
  </DataGrid.Columns>
</DataGrid>
我尝试了以下方法
dataGrid.Items.Add(new[] {\"a1\",\"a2\",\"a3\"});
dataGrid.Items.Add(new[] {\"b1\",\"b2\",\"b3\"});
dataGrid.Items.Add(new Dictionary<string,string>() {
    {\"Foo\",\"a1\"},{\"Bar\",\"a2\"},{\"Baz\",\"a3\"},});

dataGrid.Items.Add(new Dictionary<string,\"b1\"},\"b2\"},\"b3\"},});
请注意,即使在我的示例中,列在Xaml中定义并且是静态的,但对于我的应用程序,它们将不在Xaml中,而是在运行时生成的(因此,我不能只创建具有属性\“ Foo \ “,\” Bar \“,\” Baz \“)     

解决方法

最好的选择可能是以实现“ 3”的类的形式展示您的商品。这样,您可以根据需要动态添加属性,然后
DataGrid
将自动选择它们(如果将
AutoGenerateColumns
设置回
true
)。 另一种选择是使用
ExpandoObject
,但是
DataGrid
将无法自动检测属性。但是,如果您手动创建列,则可以使用:
dg.Columns.Add(new DataGridTextColumn { Header = \"Foo\",Binding = new Binding(\"Foo\") });
dg.Columns.Add(new DataGridTextColumn { Header = \"Bar\",Binding = new Binding(\"Bar\") });
dg.Columns.Add(new DataGridTextColumn { Header = \"Baz\",Binding = new Binding(\"Baz\") });


dynamic x = new ExpandoObject();
x.Foo = 42;
x.Bar = \"Hello\";
x.Baz = DateTime.Today;
dg.Items.Add(x);

x = new ExpandoObject();
x.Foo = 0;
x.Bar = \"zzz\";
x.Baz = DateTime.MinValue;
dg.Items.Add(x);
编辑:实际上,我知道您可能在编译时不知道属性的名称,因此
ExpandoObject
不会为您工作。相反,您可以使用我在此博客文章中发布的示例类,并添加按名称访问属性的方法:
public class MyDynamicObject : DynamicObject
{
    private Dictionary<string,object> _properties = new Dictionary<string,object>();

    public override bool TryGetMember(GetMemberBinder binder,out object result)
    {
        return _properties.TryGetValue(binder.Name,out result);
    }

    public override bool TrySetMember(SetMemberBinder binder,object value)
    {
        _properties[binder.Name] = value;
        return true;
    }

    public void SetProperty(string name,object value)
    {
        _properties[name] = value;
    }

    public object GetProperty(string name)
    {
        return _properties[name];
    }
}
EDIT2:我只是意识到我忘记了另一种非常简单的方法:使用
DataTable
。它很容易设置,
DataGrid
将能够自动生成列。     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...