WPF ListView загружен через связывание с XmlDataProvider, и я хочу изменить размер столбцов после создания элементов - PullRequest
0 голосов
/ 05 марта 2010

Вот мой XAML:

<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.

Я хочу изменить размер столбцов после все элементы были загружены, и я пытался сделать это в обработчике Loaded для ListView, но тогда коллекция элементов была пуста.

Есть ли подходящее событие для обработки для выполнения этой операции, или есть удобный способ сделать это в XAML? Я видел один пост, в котором упоминалось использование CellTemplate и перехват события Loaded из ячеек ...

Я уверен, что повсеместно нарушаю MVVM, но, поскольку я довольно новичок в WPF и XAML, я не позволю этому слишком беспокоить меня!

Буду признателен за любую помощь.

1 Ответ

1 голос
/ 08 марта 2010

ОК - вот как я это сделал:

<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>  

В качестве дополнительного небольшого бонуса последний столбец будет отображаться как HyperLink, и у меня есть обработчик в коде позади.

Я знаю, что XAML очень многословен, и, вероятно, есть способ сжать его, используя выражения "{}", но я не совсем уверен, как.

...