Как динамически связать XML с WPF DataGrid в C # - PullRequest
1 голос
/ 20 октября 2010

Я искал это, но все примеры, которые я мог найти, использовали XAML, что делало решение слишком статичным.Вот что я хочу сделать:

Я хотел бы заполнить столбцы, строки и атрибуты DataGrid из файла XML, который будет указан во время выполнения.Ничто в атрибутах DataGrid не может быть исправлено;XML объясняет это до последней детали (следовательно, почему примеров XAML, которые я видел, недостаточно).

Детали файла XML открыты, поэтому подойдет любой макет, но в качестве примера:

<data>
    <row Column="Col 1" Value="100" />
    <row Column="Col 2" Value ="200" />
</data>

Получит сетку из 2 столбцов с именами Column & Value соответственно со значениями ("Col 1", 100) и ("Col 2", 200) для строк 1 и 2 соответственно.

Опять же, у меня нет проблем с радикально отличающимся XML, поэтому я возьму то, что работает.

Что-то вроде этого кажется очень полезным, поскольку это позволило бы создавать общие компоненты просмотра данных в различныхдоменов.XML предоставит удобный общий формат для передачи структурированных данных, а DataGrid обеспечит богатый опыт просмотра.

Ответы [ 2 ]

3 голосов
/ 21 октября 2010

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

using System.Xml.Linq;    // Required for XElement...
using System.Collections; // Required for Hashtable

private void InitGridFromXML(string xmlPath)
{
    var data = XElement.Load(xmlPath);

    // Set Grid data to row nodes (NOTE: grid = DataGrid member)
    var elements = data.Elements("row");
    grid.ItemsSource = elements;

    // Create grid columns from node attributes.  A hashtable ensures
    // only one column per attribute since this iterates through all
    // attributes in all nodes.  This way, the grid can handle nodes with
    // mutually different attribute sets.
    var cols = new Hashtable();
    foreach (var attr in elements.Attributes())
    {
        var col = attr.Name.LocalName;

        // Only add col if it wasn't added before
        if (!cols.Contains(col))
        {
            // Mark col as added
            cols[col] = true;

            // Add a column with the title of the attribute and bind to its
            // value
            grid.Columns.Add(new DataGridTextColumn
            {
                Header = col,
                Binding = new Binding("Attribute[" + col + "].Value")
            });
        }
    }
}
0 голосов
/ 20 октября 2010

Вы можете сериализовать XML в коллекцию и связать эту коллекцию.

Вы можете создать таблицу данных из своего XML и связать ее с сеткой данных.

Пока у вас есть данные в основном формате детализации, не имеет значения, в какую структуру вы их поместите.

XML, если вы делаете как,

представляет данные в строках и значениях столбцов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...