微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决当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
将能够自动生成列。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?