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