Правильно привязать XML к DataGrid WPF (Раунд 2) И создать новую DataGrid во время выполнения - PullRequest
0 голосов
/ 24 июля 2011

У меня есть XML-файл, который я собираюсь использовать в качестве базы данных для моего проекта, это XML-файл, который у меня есть:

http://pastebin.com/JgyYkn4E

Я нашел этот вопрос и попробовал: Как правильно связать XML с сеткой данных WPF?

Я хочу отобразить Cadeiras каждого Semestre , отдельно, по одному в каждой DataGrid. Изменил некоторые мелочи, чтобы они подходили для моего проекта, но он не работал, потратив несколько часов, мне удалось заставить его работать, запрашивая XElement с этим:

XElement db = XElement.Load("db.xml");
var cadeira = from elem in db.Descendants("Semestre")
              where elem.Element("Nome").Value == "Semestre 1"
              select elem.Element("Cadeiras");
dataGrid1.DataContext = cadeira;

Первый вопрос: это сработало, но я просто хочу знать, лучше ли это делать, потому что эта DataGrid находится внутри TabItem (который находится внутри TabControl), позже мне придется создавать новые TabItems (для каждого семестра). с DataGrid внутри с Cadeiras этого соответствующего Семестра) во время выполнения, без помощи привязки XAML.

Второй вопрос: В чем отличие XAML между привязкой, как здесь Как правильно связать xml с сеткой данных WPF? и привязкой как это Связывание WPF Datagrid с xml ?

Заранее спасибо.

С уважением,

-N

1 Ответ

0 голосов
/ 24 июля 2011

Вы можете сделать много через данные, шаблонизирующие , попробуйте этот пример в XAML-парсере (например, Kaxaml ):

<Page
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:sys="clr-namespace:System;assembly=mscorlib">
  <Page.Resources>
    <XmlDataProvider x:Key="data" XPath="GPA/Semestre" Source="http://pastebin.com/raw.php?i=JgyYkn4E"/>
  </Page.Resources>
  <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
      <TabControl ItemsSource="{Binding Source={StaticResource data}}">
        <TabControl.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding XPath=Nome}"/>
            </DataTemplate>
        </TabControl.ItemTemplate>
        <TabControl.ContentTemplate>
            <DataTemplate>
                <DataGrid ItemsSource="{Binding XPath=Cadeiras/Cadeira}" AutoGenerateColumns="False">
                    <DataGrid.Columns>
                        <DataGridTextColumn Header="Activa" Binding="{Binding XPath=Activa}"/>
                        <DataGridTextColumn Header="Nome" Binding="{Binding XPath=Nome}"/>
                        <DataGridTextColumn Header="Nota" Binding="{Binding XPath=Nota}"/>
                    </DataGrid.Columns>
                </DataGrid>
            </DataTemplate>
        </TabControl.ContentTemplate>
      </TabControl>
  </ScrollViewer>
</Page>

Это создаст TabControl и все DataGrids для вас. (В вашем примере Cadeiras не выглядят очень сложными, поэтому каждая из них представляет собой всего лишь одну строку в DataGrid, если вам нужна одна DataGrid для Cadeira, вы можете сделать это также, создав ItemsControl, чей ItemTemplate равен a DataGrid)


Разница между методами в этих вопросах заключается в том, что они используют разные классы для представления XML, обычно вы бы не использовали XElement, поскольку это не будет поддерживать XPath в привязках.

LINQ to XML объекты XDocument и XElement не используют XPath. Подробнее см. Как: привязать к XDocument, XElement или LINQ для результатов запроса XML.


По сути, нет правильного способа сделать это, но, поскольку есть собственная поддержка привязки для XmlDataProviders и, таким образом, XmlDocuments, я бы согласился с этим, если у меня нет значительного причина не.

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