Silverlight: привязка динамических данных к сетке данных - PullRequest
2 голосов
/ 17 сентября 2010

Недавно я столкнулся с проблемой, надеясь, что вы все поможете.

Мне было поручено создать приложение, которое может принимать любой DataSet и отображать его в виде ряда сеток (используя что-то вроде элемента управления с вкладками).

Мне удалось сделать это довольно легко в WPF: 1. Создайте службу WCF, которая возвращает объект DataSet 2. Создайте окно WPF с сеткой данных 3. Свяжите DataTables набора данных с WPF DataGrids, используя AutoGenerateColumns = True

Теперь меня попросили сделать это в Silverlight. Таким образом, по сути, я не буду знать, как будет выглядеть таблица, которую я получу, поэтому я не могу создать класс со свойствами, которые можно бросить в коллекцию и связать. Silverlight не разрешает DataSets.

Мне кажется, что это должно быть довольно распространенной потребностью для любой платформы, есть ли способ справиться с этим, который не требует огромного количества кода для обхода ограничений?

Ответы [ 3 ]

1 голос
/ 17 сентября 2010

Одним из решений является передача информации о столбцах DataSet и XML-данных DataSet на silverlight.Со стороны Silverlight создайте динамический объект данных на основе этих данных с помощью функций, предоставляемых пространством имен System.Reflection.Emit.Затем свяжите Список динамически созданного DataObject с DataGrid.Динамический объект данных будет иметь одно свойство для каждого столбца в наборе данных с одинаковым типом данных.

Поскольку у нас есть информация о столбцах, кроме данных, привязка к DataGrid может быть очень гибкой.вы можете установить AutoGeneratedColumn = true, чтобы он отображал все данные в наборе данных, или я могу динамически генерировать столбцы, которые я хочу отображать.

Образец исходного кода можно загрузить здесь: здесь

1 голос
/ 21 марта 2012

В этом руководстве предлагается подход, который выглядит намного проще, чем создание динамических классов.Вы в основном используете свойство Converter для привязки к индексированному значению в строке данных.

Я только что попробовал этот подход, и он, кажется, отлично работает.Вот некоторый код:

/// <summary>
/// Allows us to bind columns to dictionary entries.
/// </summary>
public class DictionaryConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var dict = (IDictionary) value;
        return dict[parameter];
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

Использование:

List<IDictionary<string, object>> dicts = GetDictionaryData();
foreach (var series in _trendChart.Series)
{
    _dataGrid.Columns.Add(
        new DataGridTextColumn{
            Header = series.Name, 
            Binding = new Binding{
                Converter = new DictionaryConverter(), 
                ConverterParameter = series.Name
            }
        });
}
_dataGrid.ItemsSource = dicts;

Обновление

Эта статья включает в себя гораздо более полный набор кода, который делает ееможно добавить сортировку и другие расширенные функции.

1 голос
/ 17 сентября 2010

Мой личный ответ - не использовать DataSets (я думаю, они все равно ужасные); вместо этого сделайте так, чтобы ваши службы WCF возвращали бизнес-объекты, предпочтительно с помощью некоторой платформы ORM (Entity Framework, NHibernate и т. д.), чтобы сделать это проще.

Или вы можете использовать Linq to DataSet для создания объектов из DataSet перед отправкой их через WCF.

Также см. эти темы для получения более подробной информации.

...