如何解决当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 举报,一经查实,本站将立刻删除。