正确地将XML绑定到WPF数据网格(第2轮),并在运行时创建新的数据网格

本文关键字:数据 数据网 网格 创建 运行时 绑定 XML WPF 正确地 2轮 | 更新日期: 2023-09-27 18:03:23

我有一个XML文件,我要用它作为我的项目数据库,这是我的XML文件:

http://pastebin.com/JgyYkn4E

我发现了这个问题并尝试了一下:如何将xml绑定到WPF数据网格正确?

我想分别显示每个SemestreCadeiras,每个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内),以后我将不得不创建新的TabItem(每个学期,DataGrid内部与Cadeiras各自的学期)在运行时,没有XAML绑定援助。

第二个问题:在XAML中,这里的绑定有什么区别?如何正确地将xml绑定到WPF数据网格?和这个WPF数据网格绑定到xml ?

提前感谢。

最诚挚的问候,

- n

正确地将XML绑定到WPF数据网格(第2轮),并在运行时创建新的数据网格

您可以通过数据模板做很多,在xml - parser中试试这个例子:

<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和所有datagrid。(在您的示例中,Cadeira看起来并不复杂,因此每个Cadeira只是DataGrid中的一行,如果每个Cadeira需要一个DataGrid,您也可以通过创建ItemTemplateDataGridItemsControl来实现)


这些问题中的方法之间的区别在于它们使用不同的类来表示XML,通常您不会使用XElement,因为它在绑定中不支持XPath

LINQ到XML对象XDocument和XElement不使用XPath。具体操作请参见如何:绑定到XDocument、XElement或LINQ用于XML查询结果


没有固有的正确方法来做到这一点,但由于XmlDataProvidersXmlDocuments都有本地绑定支持,除非我有重要的理由不这样做。