如何/可能/可能将WPF DataGrid绑定到对象List,每个对象都包含一个Dictionary <string,string>中的某些值?</string,string>

时间:2010-04-06 16:49:40

标签: wpf wpftoolkit

风滚草的主要编辑,可能仍然是风滚草......

如果我有一个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!
________________________

2 个答案:

答案 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类中进行适当的转换。