Как программно вставить строки в DataGrid Silverlight без привязки? - PullRequest
2 голосов
/ 08 июня 2010

Я использую общую сетку данных Silverlight для отображения результатов поиска. «Схема» поиска может варьироваться от запроса к запросу.

Чтобы приспособиться к этому, я пытаюсь динамически заполнять DataGrid. Я могу установить явно установить столбцы, но у меня возникают проблемы при настройке ItemSource. Все примеры MSDN устанавливают ItemSource для коллекции со строгим типом (например, пользовательский тип с открытыми свойствами, соответствующими схеме). Затем DataGrid использует отражение, чтобы отфильтровать строгий тип для открытых свойств, которые будут соответствовать столбцам.

Поскольку мои результаты поиска являются динамическими, я не могу создать строгий тип для представления того, что возвращается. Могу ли я не просто предоставить DataGrid произвольный список объектов, если количество объектов в каждом списке соответствует количеству столбцов? Кто-нибудь знает, возможно ли это?

Я бы хотел сделать что-то похожее на это:

List<List<object>> myResults = <voodoo that populates the result list>

myDataGrid.ItemsSource = myResults;

Ответы [ 3 ]

1 голос
/ 08 июня 2010

Следующая статья помогает мне понять, что я хочу: http://blogs.msdn.com/b/scmorris/archive/2008/04/14/defining-silverlight-datagrid-columns-at-runtime.aspx

По сути, вы должны иметь свойство привязки.Вы не можете просто создавать строки на основе произвольного списка элементов.Я наткнулся на пару проектов с открытым исходным кодом, которые решают эту проблему, используя отражение для создания типов CLR во время выполнения, а затем связываются с этими типами.

1 голос
/ 19 июня 2010

Колин Эберхардт опубликовал оригинальное решение описанной вами проблемы -

http://www.scottlogic.co.uk/blog/colin/2010/03/binding-a-silverlight-3-datagrid-to-dynamic-data-via-idictionary-updated/

0 голосов
/ 08 июня 2010

Да, это возможно. Вот сэмпел смахнул с MSDN используя Систему; using System.Collections.Generic; использование System.Windows.Controls;

namespace DataGridSnippets
{
    public partial class Page : UserControl
    {
        public Page()
        {
            InitializeComponent();

            // Set the ItemsSource to autogenerate the columns.
            dataGrid1.ItemsSource = Customer.GetSampleCustomerList();
            dataGrid3.ItemsSource = Customer.GetSampleCustomerList();
            dataGrid4.ItemsSource = Customer.GetSampleCustomerList();
            dataGrid5.ItemsSource = Customer.GetSampleCustomerList();
        }
    } 

    public class Customer
    {
        public String FirstName { get; set; }
        public String LastName { get; set; }
        public String Address { get; set; }
        public Boolean IsNew { get; set; }

        // A null value for IsSubscribed can indicate 
        // "no preference" or "no response".
        public Boolean? IsSubscribed { get; set; }

        public Customer(String firstName, String lastName, 
            String address, Boolean isNew, Boolean? isSubscribed)
        {
            this.FirstName = firstName;
            this.LastName = lastName;
            this.Address = address;
            this.IsNew = isNew; 
            this.IsSubscribed = isSubscribed;
        }

        public static List<Customer> GetSampleCustomerList()
        {
            return new List<Customer>(new Customer[4] {
                new Customer("A.", "Zero", 
                    "12 North Third Street, Apartment 45", 
                    false, true), 
                new Customer("B.", "One", 
                    "34 West Fifth Street, Apartment 67", 
                    false, false),
                new Customer("C.", "Two", 
                    "56 East Seventh Street, Apartment 89", 
                    true, null),
                new Customer("D.", "Three", 
                    "78 South Ninth Street, Apartment 10", 
                    true, true)
            });
        }
    }
}
...