Wpf 如何使用XPath设置ListView控件的ItemSource

Wpf 如何使用XPath设置ListView控件的ItemSource,wpf,listview,xslt,wpf-controls,xslt-1.0,Wpf,Listview,Xslt,Wpf Controls,Xslt 1.0,这个问题有点棘手,因为整个代码都是通过XSLT自动生成的。这意味着我必须面对一些限制(没有代码隐藏等) 我通过XSLT成功生成了一个包含ListView的XAML文件。XAML文件还包含一个XMLDataProvider。数据源和提供程序都很好,我只是不知道如何为ListView ItemSource属性设置XPath 这是我的数据源: <RelatedContacts> <Contact ShowsInterest="true">

这个问题有点棘手,因为整个代码都是通过XSLT自动生成的。这意味着我必须面对一些限制(没有代码隐藏等)

我通过XSLT成功生成了一个包含ListView的XAML文件。XAML文件还包含一个XMLDataProvider。数据源和提供程序都很好,我只是不知道如何为ListView ItemSource属性设置XPath

这是我的数据源:

<RelatedContacts>
        <Contact ShowsInterest="true">
            <Name>John</Name>
            <Lastname>Doe</Lastname>
        </Contact >
        <Contact ShowsInterest="true">
            <Name>Max</Name>
            <Lastname>Mustermann</Lastname>
        </Contact >
        <Contact ShowsInterest="true">
            <Name>Claire</Name>
            <Lastname>Grube</Lastname>
        </Contact >
</RelatedContacts>
总而言之,这是我努力实现的目标:

ItemsSource="{Binding XPath=/Contact/RelatedContacts//*}
然后

<GridViewColumn Header="Name" DisplayMemberBinding="{Binding XPath=Name}" />

只要用正确的方法去做就行了

    <ListView ItemsSource="{Binding XPath=/Contact/RelatedContacts/*}" Name="listview1" DockPanel.Dock="Left, Right, Top, Bottom" Height="125" Background="White" Foreground="Black" Visibility="visible" BorderThickness="1,1,1,1" FontFamily="Tahoma" FontSize="9" FontStyle="Normal" TabIndex="0" IsTabStop="True">
      <ListView.View>
        <GridView>
          <GridViewColumn Header="Name" DisplayMemberBinding="{Binding XPath=Name}" />
          <GridViewColumn Header="Lastname" DisplayMemberBinding="{Binding XPath=Lastname}" />
          <GridViewColumn Header="Age" DisplayMemberBinding="{Binding XPath=Age}" />
          <GridViewColumn Header="Street" DisplayMemberBinding="{Binding XPath=Street}" />
          <GridViewColumn Header="City" DisplayMemberBinding="{Binding XPath=City}" />
          <GridViewColumn Header="Postal code" DisplayMemberBinding="{Binding XPath=PostalCode}" />
          <GridViewColumn Header="Country" DisplayMemberBinding="{Binding XPath=Country}" />
        </GridView>
      </ListView.View>
    </ListView>

<Columns>
  <Column title="Name" mapNode="Contact\Name" width="0" />
  <Column title="Lastname" mapNode="BusinessContact\Lastname" width="0" />
</Columns>
ItemsSource="{Binding XPath=/Contact/RelatedContacts//*}
<GridViewColumn Header="Name" DisplayMemberBinding="{Binding XPath=Name}" />
 <!-- Transformiere ListViewWrapper zu ListView -->
  <xsl:template match="ListViewWrapper">
    <xsl:element name="ListView">
      <xsl:attribute name="ItemsSource">
        <xsl:variable name="binding-path" select="./@mapNode"/>
        <xsl:variable name="bindpath" select="translate($binding-path, '\','/')" />
        <xsl:value-of select="concat('{Binding XPath=/',$bindpath,'/*}')"/>
      </xsl:attribute>
      <xsl:apply-templates select="@*|*" mode="to-attr" />
      <xsl:element name="ListView.View">
        <xsl:apply-templates select="*" />
      </xsl:element>
    </xsl:element>
  </xsl:template>

  <!-- ListView: Transformieren von Columns (Wrapper) zu GridView -->
  <xsl:template match="Columns">
    <xsl:element name="GridView">
      <xsl:apply-templates select="*" />
    </xsl:element>
  </xsl:template>

  <!-- ListView: Transformieren von Column zu GridViewColumn -->
  <xsl:template match="Column">
    <xsl:variable name="binding-path" select="./@mapNode"/>
    <xsl:element name="GridViewColumn">
      <xsl:apply-templates select="@*" />
      <xsl:attribute name="Header">
        <xsl:value-of select="./@title" />
      </xsl:attribute>
      <xsl:attribute name="DisplayMemberBinding">
        <xsl:variable name="bindpath" select="translate($binding-path, '\','/')" />
        <xsl:value-of select="concat('{Binding XPath=../',$bindpath,'}')"/>
      </xsl:attribute>
      <xsl:call-template name="listbox-width"/>
    </xsl:element>
  </xsl:template>

  <!-- ListView: Setzen der Column width. Falls 0 dann nichts angeben (auto size) -->
  <xsl:template match="width" name="listbox-width">
    <xsl:if test="./@width != 0">
      <xsl:attribute name="Width">
        <xsl:value-of select="./@width" />
      </xsl:attribute>
    </xsl:if>
  </xsl:template>

  <!-- Ausschluss des ListView Width Attribut -->
  <xsl:template match="ListViewWrapper/@width"
              mode="to-attr" />
    <ListView ItemsSource="{Binding XPath=/Contact/RelatedContacts/*}" Name="listview1" DockPanel.Dock="Left, Right, Top, Bottom" Height="125" Background="White" Foreground="Black" Visibility="visible" BorderThickness="1,1,1,1" FontFamily="Tahoma" FontSize="9" FontStyle="Normal" TabIndex="0" IsTabStop="True">
      <ListView.View>
        <GridView>
          <GridViewColumn Header="Name" DisplayMemberBinding="{Binding XPath=Name}" />
          <GridViewColumn Header="Lastname" DisplayMemberBinding="{Binding XPath=Lastname}" />
          <GridViewColumn Header="Age" DisplayMemberBinding="{Binding XPath=Age}" />
          <GridViewColumn Header="Street" DisplayMemberBinding="{Binding XPath=Street}" />
          <GridViewColumn Header="City" DisplayMemberBinding="{Binding XPath=City}" />
          <GridViewColumn Header="Postal code" DisplayMemberBinding="{Binding XPath=PostalCode}" />
          <GridViewColumn Header="Country" DisplayMemberBinding="{Binding XPath=Country}" />
        </GridView>
      </ListView.View>
    </ListView>