【问题标题】:How to bind the xml element name to a ListView column in WPF XAML file如何将 xml 元素名称绑定到 WPF XAML 文件中的 ListView 列
【发布时间】:2012-11-30 02:39:23
【问题描述】:

我有类似于下面示例的 XML 数据,我正在尝试将其绑定到 ListView。我无法绑定元素名称,即示例中的汽车品牌。我从这篇帖子 Xaml Support for Local Name in XPath 中发现 xaml 不支持 xpath 函数名称。因此,local-name() 不起作用。但是必须有办法做到这一点......

<Window x:Class="WpfApplication4.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow"
        Height="350"
        Width="525">
  <Window.Resources>
    <XmlDataProvider x:Key="DataSource">
      <x:XData>
        <Cars xmlns="">
          <Data>
            <Honda Year="2012"
                   Color="Red"
                   Model="Accord" />
            <Subuar Year="2008"
                    Color="Blue"
                    Model="Outback" />
            <Ford Year="2000"
                  Color="Black"
                  Model="Focus" />
          </Data>
        </Cars>
      </x:XData>
    </XmlDataProvider>
  </Window.Resources>
  <ListView ItemsSource="{Binding XPath=Cars/Data/*}"
            DataContext="{StaticResource DataSource}">
    <ListView.View>
      <GridView>
        <GridViewColumn DisplayMemberBinding="{Binding XPath=???}"
                        Header="Brand" />
        <GridViewColumn DisplayMemberBinding="{Binding XPath=@Year}"
                        Header="Year" />
        <GridViewColumn DisplayMemberBinding="{Binding XPath=@Color}"
                        Header="Color" />
        <GridViewColumn DisplayMemberBinding="{Binding XPath=@Model}"
                        Header="Model" />
      </GridView>
    </ListView.View>
  </ListView>
</Window>

【问题讨论】:

  • 由于是单向绑定,我为它写了一个转换器。

标签: c# wpf xaml data-binding xpath


【解决方案1】:

如果您使用普通的Binding.Path,则应该绑定到DataContext 对象的属性,该对象应该是XmlElement,所以只需尝试{Binding Name}

【讨论】:

    【解决方案2】:

    我认为您不能绑定到元素名称,需要“name()”或“local-name()”XPath 函数,但 Xaml 不支持它们。您可以解决它,请参阅此 URL:

    XAML support for local-name() in XPath

    但这确实有效,而且不像 hack-ar 那样难看,只是需要稍微不同的 XML 输入:

    <Window.Resources>
        <XmlDataProvider x:Key="DataSource">
            <x:XData>
                <Cars xmlns="">
                    <Data>
                        <Car Brand="Honda" Year="2012" Color="Red" Model="Accord"/>
                        <Car Brand="Subuaru" Year="2008" Color="Blue" Model="Outback"/>
                        <Car Brand="Ford" Year="2000" Color="Black" Model="Focus"/>
                    </Data>
                </Cars>
            </x:XData>
        </XmlDataProvider>
    </Window.Resources>
    <ListView ItemsSource="{Binding XPath=Cars/Data/*}" DataContext="{StaticResource DataSource}">
        <ListView.View>
            <GridView>
                <GridViewColumn DisplayMemberBinding="{Binding XPath=@Brand}" Header="Brand"/>
                <GridViewColumn DisplayMemberBinding="{Binding XPath=@Year}" Header="Year"/>
                <GridViewColumn DisplayMemberBinding="{Binding XPath=@Color}" Header="Color"/>
                <GridViewColumn DisplayMemberBinding="{Binding XPath=@Model}" Header="Model"/>
            </GridView>
        </ListView.View>
    </ListView>
    

    【讨论】:

    • 数据来自服务提供商,我无法控制其格式。
    猜你喜欢
    • 2011-07-31
    • 2016-10-14
    • 1970-01-01
    • 1970-01-01
    • 2014-04-07
    • 1970-01-01
    • 2014-12-08
    • 2015-11-14
    • 1970-01-01
    相关资源
    最近更新 更多