如果我有一个Customers列表,并且每个Customer的数据都包含在Dictionary中,我如何将列表绑定到DataGrid,以便每个字符串键都是一列?
编辑:N.B。我知道这不是设计Customer类的好方法。
e.g。
public class Customer{
public int Id{get;set;}
private Dictionary<string,string> values;
public Dictionary<string,string> Values{get {return values;}}
public Customer(int id){
this.Id = id;
values["Name"] = "Peter";
values["Age"] = 129.ToString();
values["HairColour"] = "See through!";
}
}
......当天晚些时候......
var Customers = new List<Customer>(){
new Customer(1),
new Customer(2),
new Customer(3)
};
......然后......
<DataGrid ItemsSource={Binding Path=Customers}/>
...期望的结果。
Id | Name | Age | HairColour
________________________
1 | Peter| 129 | See through!
________________________
2 | Peter| 129 | See through!
________________________
3 | Peter| 129 | See through!
________________________
答案 0 :(得分:1)
在没有其他建议的情况下this article是我能提出的最佳答案。在他的文章中,Miron正在处理来自Web服务的XML数据,并将其转换为用于数据绑定的Reflection生成类型。
我可以按照他的方法创建一个使用我的Dictionary键而不是xml节点作为生成类型属性的源的类型。对于其他简单的应用程序,我正在构建它似乎相当沉重,但至少我了解Reflection API。
如果有人关心评论或仍然可以为我提供更好的解决方案,我会很感激。
或者,轻松的道路......
public partial class Window2 : Window
{
public Window2()
{
InitializeComponent();
var a1 = new A();
a1["Name"] = "Jack";
a1["Age"] = "9";
var a2 = new A();
a2["Name"] = "Jill";
a2["Age"] = "7";
List<A> items = new List<A>() { a1, a2 };
this.DataBoundItems = items;
dg.DataContext = this;
}
public List<A> DataBoundItems { get; set; }
private void dg_DataContextChanged(
object sender,
DependencyPropertyChangedEventArgs e)
{
foreach (string key in DataBoundItems[0].Values.Keys)
{
var col = new DataGridTextColumn();
col.Header = key;
// bind to the indexer on the class
col.Binding = new Binding("[" + key + "]");
dg.Columns.Add(col);
}
}
}
public class A
{
private Dictionary<string, string> values = new Dictionary<string, string>();
public string this[string index]
{
get
{
return values[index];
}
set
{
values[index] = value;
}
}
public Dictionary<string, string> Values { get { return aValues; } }
}
答案 1 :(得分:0)
我没有得到您的Customer类的设计。如下客户类更安全。这也会使绑定变得更容易。
public class Customer
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public HairColor HairColor { get; set; }
}
public enum HairColor
{
SeeThrough,
Black,
Brown,
Blond
}
如果原因是因为这是你从数据库中获取它的方式,那么将你的类视为Model,将我的类视为ViewModel,并在ViewModel类中进行适当的转换。