Как можно / можно / можно связать WPF DataGrid со списком объектов, каждый из которых имеет некоторые значения в словаре <строка, строка>? - PullRequest
0 голосов
/ 06 апреля 2010

крупное редактирование перекладин, может остаться перевёрткой ...

Если у меня есть список Клиентов, и данные для каждого Клиента содержатся в Словаре, как я могу связать список с DataGrid, чтобычто каждый строковый ключ является столбцом?

Редактировать: NB. Я знаю, что это не очень хороший способ разработки класса 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!
________________________

Ответы [ 2 ]

1 голос
/ 17 апреля 2010

В отсутствие других предложений эта статья - лучший ответ, который я могу придумать.В своей статье Мирон работает с XML-данными из веб-службы и преобразует их в сгенерированный тип Reflection для привязки данных.

Я могу следовать его подходу и создать тип, который использует мои ключи Dictionary, а не узлы xml в качестве источника для свойств сгенерированного типа.Для простого приложения, которое я создаю, оно кажется довольно сложным, но, по крайней мере, я узнаю об API Reflection.

Если кто-то захочет прокомментировать или все же сможет предоставить мне лучшее решение, я был бы признателен.


Или легкая дорога ...

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; } }
}
0 голосов
/ 17 апреля 2010

Я не понимаю дизайн вашего класса 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
}

Если причина в том, что именно так вы и получаете его из базы данных, тогда рассматривайте ваш класс как Модель, а мой класс как ViewModel с соответствующим преобразованием, выполненным в классе ViewModel.

...