2010-03-04 35 views
0

這是我的XAML:WPF的ListView加載,我想調整列創建項目後

<Window x:Class="Application.SeeProductVersions" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:Application.ApplicationData" 
    Title="Product Versions" Height="300" Width="640" Loaded="Window_Loaded"> 
    <Window.Resources> 
    <XmlNamespaceMappingCollection x:Key="VersionDataNamespaceMapping"> 
     <XmlNamespaceMapping Uri="http://whereever.com/VersionData" Prefix="vdata" /> 
    </XmlNamespaceMappingCollection> 

    <XmlDataProvider x:Key="ProductDataXmlFile" XmlNamespaceManager="{StaticResource VersionDataNamespaceMapping}"></XmlDataProvider> 
    </Window.Resources> 
<ListView x:Name="m_lvProductVersions" ItemsSource="{Binding Source={StaticResource ProductDataXmlFile}, XPath=//vdata:PRODUCTDATA/vdata:PRODUCT}" Loaded="m_lvProductVersions_Loaded"> 
    <ListView.View> 
    <GridView> 
     <GridViewColumn x:Name="colProduct" Width="64" Header="Product" DisplayMemberBinding="{Binding XPath=vdata:NAME}"/> 
     <GridViewColumn x:Name="colVersion" Width="64" Header="Version" DisplayMemberBinding="{Binding XPath=vdata:VERSION}"/>  
     <GridViewColumn x:Name="colLink" Width="256" Header="Download Link" DisplayMemberBinding="{Binding XPath=vdata:LINK}"/> 
    </GridView> 
    </ListView.View> 
    </ListView> 
</Window> 

下面是一些示例XML:

<?xml version="1.0" encoding="utf-8"?> 
    <vdata:PRODUCTDATA xmlns:vdata="http://whereever.com/VersionData"> 
    <vdata:PRODUCT> 
     <vdata:ID>04</vdata:ID> 
     <vdata:NAME>ProductWithALongName</vdata:NAME> 
     <vdata:VERSION>8.7.12.0</vdata:VERSION> 
     <vdata:LINK>http://www.whereever.com/support/LongNames/ProductWithALongName-download.asp</vdata:LINK> 
    </vdata:PRODUCT> 
    <vdata:PRODUCT> 
     <vdata:ID>07</vdata:ID> 
     <vdata:NAME>ModerateName</vdata:NAME> 
     <vdata:VERSION>9.12.5.0</vdata:VERSION> 
     <vdata:LINK>http://www.whereever.com/support/ModerateNames/ModerateName-download.asp</vdata:LINK> 
    </vdata:PRODUCT> 
    <vdata:PRODUCT> 
     <vdata:ID>16</vdata:ID> 
     <vdata:NAME>ShortName</vdata:NAME> 
     <vdata:VERSION>9.9.19.0</vdata:VERSION> 
     <vdata:LINK>http://www.whereever.com/support/ShortNames/ShortName-download.asp</vdata:LINK> 
    </vdata:PRODUCT> 
    </vdata:PRODUCTDATA> 

FWIW,我得到SeeProductVersions的構造函數中的路徑,從資源中獲取XmlDataProvider對象,並將基於該路徑的新Uri移入Source。

我想調整的大小後所有的項目都已經加載,我試圖在ListView的加載處理程序中執行它,但items集合是空的。

是否有一個合適的事件來處理,以執行此操作,或者是有一個整潔的方式做到這一點的XAML?我確實看到一篇文章提到使用CellTemplate並從單元格中捕獲Loaded事件。我確信我違反了MVVM,但由於我對WPF和XAML很新穎,因此我我不會讓這太煩擾我!

任何幫助,將不勝感激。

+0

我想因爲我知道數據來自哪裏,並有權訪問它,那麼我可以預先解析它,然後找出寬度。另外,我看到集合中的「items」實際上是XElements ...或類似的東西。 – GTAE86 2010-03-04 22:37:15

回答

1

OK - 這裏是我最後只是:

<Window x:Class="Application.SeeProductVersions" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:Application.ApplicationData" 
    Title="Product Versions" Height="300" Width="720" Loaded="Window_Loaded"> 
    <Window.Resources> 
    <XmlNamespaceMappingCollection x:Key="VersionDataNamespaceMapping"> 
     <XmlNamespaceMapping Uri="http://whereever.com/VersionData" Prefix="vdata" /> 
    </XmlNamespaceMappingCollection> 

    <XmlDataProvider x:Key="ProductDataXmlFile" XmlNamespaceManager="{StaticResource VersionDataNamespaceMapping}"/> 
    </Window.Resources> 

    <ListView x:Name="m_lvProductVersions" ItemsSource="{Binding Source={StaticResource ProductDataXmlFile}, XPath=//vdata:PRODUCTDATA/vdata:PRODUCT}" Loaded="m_lvProductVersions_Loaded"> 
    <ListView.View> 
     <GridView> 
     <GridViewColumn Header="Product"> 
      <GridViewColumn.CellTemplate> 
      <DataTemplate> 
       <TextBlock Width="Auto" Text="{Binding XPath=vdata:NAME}"/> 
      </DataTemplate> 
      </GridViewColumn.CellTemplate> 
     </GridViewColumn> 

     <GridViewColumn Header="Version"> 
      <GridViewColumn.CellTemplate> 
      <DataTemplate> 
       <TextBlock Width="Auto" Text="{Binding XPath=vdata:VERSION}"/> 
      </DataTemplate> 
      </GridViewColumn.CellTemplate> 
     </GridViewColumn> 

     <GridViewColumn Header="Download"> 
      <GridViewColumn.CellTemplate> 
      <DataTemplate> 
       <TextBlock> 
       <Hyperlink NavigateUri="{Binding XPath=vdata:LINK}" Click="DownloadHyperlink_Click"> 
        <TextBlock Width="Auto" Text="{Binding XPath=vdata:LINK}"/> 
       </Hyperlink> 
       </TextBlock> 
      </DataTemplate> 
      </GridViewColumn.CellTemplate> 
     </GridViewColumn> 
     </GridView> 
    </ListView.View> 
    </ListView> 
</Window> 

作爲一個額外的一點獎金,最後一欄將顯示爲超鏈接,和我在後臺代碼的處理程序。

我知道XAML是非常詳細,並有可能是一個辦法使用「{}」語句凝結,但我不太清楚如何。