Как связать со словарем IEnumerable в Silverlight? - PullRequest
0 голосов
/ 05 января 2012

Справочная информация: У меня есть следующий код в службе WCF. GetDataTable возвращает System.Data.DataTable на основе вызова базы данных SQL с переданным параметром query .

public IEnumerable<Dictionary<string, object>> GetData(string *query*) {
    var table = GetDataTable(query);
    var columns = table.Columns.Cast<DataColumn>();
    var dict = table.AsEnumerable()
        .Select(r => columns.Select(c => new {
            Column = c.ColumnName,
            Value = r[c]
        })
        .ToDictionary(i => i.Column, i => i.Value != DBNull.Value ? i.Value : null));
    return dict;
}

У меня есть приложение Silverlight, которое вызывает GetData, передает строку, и я получаю результаты. Однако в моем GridView есть поля «Comparer», «Count», «Keys» и «Value».

Фрагмент кода Silverlight

    WCFCLIENT oData = new WCFCLIENT ();
    oData.GetData+= new EventHandler<GetDataCompletedEventArgs>(oData_GetData);
    oData.GetData(*sqlquery*);
  }
}

void oData_GetDataCompleted(object sender, GetDataCompletedEventArgs e) {
  if (e.Error == null) {
    rdpPaging.Source = e.Result;    
    rgvDataResults.ItemsSource = rdpPaging.Source;
}

Мой вопрос двоякий

  1. Является ли код, который я использую для создания словаря, каким-то образом неправильным?
  2. Если код правильный, как правильно установить источник данных DataGrid, чтобы он отображал столбцы и строки, возвращаемые вызовом SQL?

Я пробовал связываться с различными свойствами переменной e.Result, но у меня были похожие результаты.

1 Ответ

1 голос
/ 05 января 2012

У вас есть два варианта ...

  1. Свяжите словарь напрямую с DataGrid, но не создавайте столбцы автоматически. Создайте столбцы вручную, пролистав все ключи в первом элементе (словаре) общего списка и используйте настраиваемую привязку / конвертер для отображения правильных данных.

  2. Я использую это с Teleric GridView, но я думаю, что это будет работать и с обычными сетями данных Silverlight.

    http://blogs.telerik.com/blogs/posts/09-04-23/lightweight-datatable-for-your-silverlight-applications.aspx

Вы можете преобразовать свой список в таблицы данных на стороне клиента и легко использовать этот подход.

[Обновить] Пример кода первой опции

            D_Grid.ItemsSource = Data;        // Data is the collection of dictionary
            foreach (var key in Data[0].Keys)
            {
                    GridViewDataColumn dataCol = null;
                    dataCol = (GridViewDataColumn)D_Grid.Columns[key];
                    if (dataCol == null)
                    {
                        dataCol = new GridViewDataColumn();
                        dataCol.Header = key;
                        dataCol.UniqueName = key;                          
                        dataCol.DataMemberBinding = new Binding()
                        {
                            Converter =new GridConverter(key); // Put your converter that will take the key and return the value from that key.
                        };
                        D_Grid.Columns.Add(dataCol);

                    }
                }

Код конвертера. Обратите внимание, что вам нужно сохранить ключ в преобразователе, который вы передаете в конструктор.

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (value is Dictionary<string, object>)
            {
                var input = (Dictionary<string, object>)value;
                if (input.ContainsKey(_key))
                    return input[_key];
            }   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...