【问题标题】:Binding XML to the WPF DataGrid correctly (Round 2) And creating new DataGrid at Run-Time将 XML 正确绑定到 WPF DataGrid(第 2 轮)并在运行时创建新的 DataGrid
【发布时间】:2011-07-23 22:42:07
【问题描述】:

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

http://pastebin.com/JgyYkn4E

我发现了这个问题并尝试了它: How to bind xml to the WPF DataGrid correctly?

我想在每个 DataGrid 中分别显示每个 SemestreCadeiras。改变了一些未成年人的东西以适应我的项目,但它没有奏效,花了几个小时后,我设法让它用这个来查询 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 ,在运行时有一个 DataGrid,里面有相应学期的 Cadeiras),没有 XAML 绑定帮助。

第二个问题:在 XAML 中,在 How to bind xml to the WPF DataGrid correctly? 中绑定和在 WPF Datagrid binding to xml 中绑定有什么区别?

提前致谢。

最好的问候,

-N

【问题讨论】:

    标签: c# wpf xml xaml data-binding


    【解决方案1】:

    您可以通过data templating很多,在 XAML-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。 (在您的示例中,Cadeiras 看起来并不复杂,因此它们中的每一个都只是 DataGrid 中的一行,如果您需要每个 Cadeira 一个 DataGrid,您也可以通过创建一个 ItemsControl 来做到这一点,其 ItemTemplateDataGrid)


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

    LINQ to XML 对象 XDocumentXElement 不使用 XPath。详情见How to: Bind to XDocument, XElement, or LINQ for XML Query Results.


    没有本质上正确的方法可以做到这一点,但由于 XmlDataProviders 具有本机绑定支持,因此 XmlDocuments 我会选择这样做,除非我有充分的理由不这样做。

    【讨论】:

    • 哇!首先,不知道我可以只使用 XAML 来完成所有这些工作,太棒了,从 XML 读取内容的事情是你有很多方法,而且没有地方可以用它们的用处来解释所有方法为。
    • 这是否回答了您的问题? (如果是这样,你可以accept it 这样,如果不是,请告诉我你认为缺少什么,我可以详细说明)
    • (抱歉,我试图编辑我的上一篇文章,遇到了一些问题,这是其余部分)例如,使用支持 XPath 的对象而不是使用 XElement 的最大原因是什么?关于您发布的xaml,我希望能够在dataGrid中插入更多数据,是否有一种“正常”的方式,而不是总是在其中创建一个带有“...”的新行,所以每次用户点击那里,他可以向该行添加一些内容(并创建一个带有“...”的新行)?
    • 我有点考虑添加新行,但找不到任何直接使用 XML 的东西,抱歉。 XPath 的优势在于它提供了一种查询 XML 的好方法。
    • 我现在遇到的阻止我添加新行的问题是我找不到在我的代码中调用 DataGrid 的方法,我打算让用户插入dataGrid 之外的新数据并使用 dataGrid.Items.Add(newItem) 添加它(并了解 Add 方法如何自行对数据进行排序)。我已经尝试在 DataGrid 中使用 Name 属性,但在代码中找不到它...
    猜你喜欢
    • 2011-01-13
    • 2011-05-14
    • 2013-10-31
    • 1970-01-01
    • 2013-06-01
    • 2015-06-21
    • 1970-01-01
    • 2014-10-23
    • 1970-01-01
    相关资源
    最近更新 更多