正确地将XML绑定到WPF DataGrid(第2轮)并在运行时创建新的DataGrid

时间:2011-07-23 22:42:07

标签: c# wpf xml xaml data-binding

我有一个XML文件,我将用作项目的数据库,这是我的xml文件:

http://pastebin.com/JgyYkn4E

我找到了这个问题并试了一下: How to bind xml to the WPF DataGrid correctly?

我想在每个DataGrid中分别显示每个 Semestre Cadeiras 。改变了一些未成年人的东西,以适应我的项目,但它没有奏效,花了几个小时后我设法让它工作查询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(对于每个Semestre) ,在运行时使用带有相应Semestre的Cadeiras的DataGrid,而没有XAML绑定辅助。

第二个问题:在XAML中,此处How to bind xml to the WPF DataGrid correctly?的绑定与此WPF Datagrid binding to xml之间的绑定有何区别?

提前致谢。

致以最诚挚的问候,

-N

1 个答案:

答案 0 :(得分:0)

您可以通过data templating 做很多<​​/ strong>,在XAML-Parser(例如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中的一行,如果每个Cadeira需要一个DataGrid,你也可以通过创建ItemsControl ItemTemplate来实现它。 1}}是DataGrid


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

  

LINQ to XML对象XDocumentXElement不使用XPath。有关详细信息,请参阅How to: Bind to XDocument, XElement, or LINQ for XML Query Results.


没有固有的正确方法可以做到这一点,但由于XmlDataProviders有本机绑定支持,因此XmlDocuments除非我有充分的理由不这样做,否则我会继续使用。