从 WPF 应用程序中的代码访问 xml 数据

Posted

技术标签:

【中文标题】从 WPF 应用程序中的代码访问 xml 数据【英文标题】:Access xml data from the code in WPF application 【发布时间】:2021-05-25 12:10:23 【问题描述】:

我有一个 xml 文件,其中包含 WPF 应用程序所需的多个分层数据。我的目标是首先使用 ComboBox 过滤数据,最后将 AttributeUp 和 AttributeDown 标签内的数据选择到代码中。

    <?xml version = "1.0" encoding="utf-8"?>
    <MenuItems xmlns="">
      <Menu Name="menu1">
        <SubMenu Name = "submenu1">
          <ItemsList>
            <Item Name = "item1">
              <AttributeUp>DataUp</AttributeUp>
              <AttributeDown>DataDown</AttributeDown>
            </Item>
         </SubMenu>
       </Menu>
   </MenuItems>

下面是添加 XmlDataProvider 到静态资源的代码。

<Window.Resources>
    <XmlDataProvider x:Key="updownItems" Source="./updownItemsList.xml" XPath="MenuItems/Menu" IsInitialLoadEnabled="True" IsAsynchronous="False"/>
</Window.Resources>

下面是我如何过滤数据

    <StackPanel Orientation="Vertical">
        <StackPanel Orientation="Horizontal">
             <Label Content="Level1" Width="35" Margin="0,0,0,0"></Label>
             <ComboBox x:Name="cmbBoxToplevel" IsEditable="True" SelectedIndex="0"  Width="110"
                     Margin="0,0,0,0" HorizontalAlignment="Right"
                     ItemsSource="Binding Source=StaticResource updownItems" 
                     DisplayMemberPath="@Name" />
        </StackPanel>
                       
        <StackPanel Orientation="Horizontal">
             <Label Content="Level2"  Margin="0,0,0,0"></Label>
             <ComboBox x:Name="cmbBoxSecondLevel" IsEditable="True"  Width="110" SelectedIndex="0" 
                 Margin="0,0,0,0" HorizontalAlignment="Right"
                 DataContext="Binding Path=SelectedItem, ElementName=cmbBoxToplevel" 
                 ItemsSource="Binding XPath=./Menu" DisplayMemberPath="@Name" />
        </StackPanel>
        
       <StackPanel Orientation="Horizontal">
             <Label Content="Level3" Margin="0,10,0,0"></Label>
              <ComboBox x:Name="cmbBoxJanya" IsEditable="True"  Width="110" SelectedIndex="0" 
                   Margin="0,10,0,0" HorizontalAlignment="Right" DataContext="Binding Path=SelectedItem, 
                   ElementName=cmbBoxSecondLevel" ItemsSource="Binding XPath=./ItemsList/Item" 
                   DisplayMemberPath="@Name" />
         </StackPanel>
 </StackPanel>

有了这些,我可以将 xml 标记名称过滤到不同的组合框中。我需要实现的是将AttributeUpAttributeDown的内容直接访问到后面的C​​#代码(MainWindow)中。我不想使用任何 WPF 元素来存储这些参数。 无需编写单独的 xml 解析代码即可

【问题讨论】:

你想要parse the XML document吗? 我想避免 XML 解析。如您所见,如果我包含一个 TextBlock,我可以将 xml 数据绑定到它并从后面的代码中访问它。我想通过将绑定分配给属性来实现类似的事情。有没有可能。 【参考方案1】:

您可以将AttributeUpAttributeDown 绑定到TextBlocks

<TextBlock x:Name="UpTxt" DataContext="Binding ElementName=cmbBoxJanya, Path=SelectedItem"
                   Text="Binding XPath=./AttributeUp"/>
<TextBlock x:Name="DownTxt" DataContext="Binding ElementName=cmbBoxJanya, Path=SelectedItem"
                   Text="Binding XPath=./AttributeDown"/>

并在后面的代码中访问值

var upValue = UpTxt.Text;
var downValue = DownTxt.Text;

【讨论】:

谢谢,我担心 TextBlock 会被显示。我使用了 Visibility="Hidden" 属性。我将此标记为答案,并建议将可见性设置为隐藏。

以上是关于从 WPF 应用程序中的代码访问 xml 数据的主要内容,如果未能解决你的问题,请参考以下文章

wpf - 根据条件从 MS 访问数据库中选择数据

如何在wpf应用程序中使gridview成为树视图的子元素

从 C# WPF 应用程序中读取 MS Access 数据库中的图像 [重复]

WPF/MVVM 应用程序中的数据访问使用啥模式

访问F#中的XAML(WPF)元素

如何从 WPF 应用程序安全可靠地与数据库交互