How can/could/might you bind WPF DataGrid to a Lis

2019-11-03 07:51发布

一个滚草的主要编辑,可以保持一个滚草...

如果我有客户,并为每一位客户数据的列表包含在字典哪能列表绑定到DataGrid使每串键是一列?

编辑:注:我知道这不是一个很好的方式来设计Customer类。

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!
________________________

Answer 1:

在没有其他的建议这篇文章是最好的答案我可以想出。 在他的文章了Miron正在与来自web服务的XML数据,并将其转换成数据绑定反思生成的类型。

我可以按照自己的方法,并创建一个使用我的字典键,而不是XML节点作为源生成的类型的属性类型。 对于本来简单的应用程序,我要建就显得太沉重,但至少我可以了解反射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; } }
}


Answer 2:

我不明白您的客户类的设计。 更安全将是一个客户类,如下所示。 这也将作出有约束力容易得多。

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
}

如果原因是,这是因为这是你如何从数据库中获取它,然后再考虑你的类的模型和我的类作为视图模型,在视图模型类进行适当改造。



文章来源: How can/could/might you bind WPF DataGrid to a List of objects each with some values in a Dictionary?