2009-08-17 7 views
4

J'ai un ListView avec environ 10 GridViewColumn et environ 100 lignes/Row. J'aimerais afficher une ligne "Total" ou une ligne récapitulative en bas de ListView.C#/WPF: Comment afficher la dernière ligne d'un ListView séparément?

Quelqu'un a-t-il une idée de la façon de faire cela, en gardant la largeur de colonne, etc. comme les autres et en en faisant un élément séparé, de sorte que le ListView "principal" peut avoir une barre de défilement?

J'ai téléchargé ici une maquette (désolé pour mon mauvais talent graphique :-)):
image

+0

Il y a un rat dans ... – cakeforcerberus

+0

@semirhage: Qu'est-ce que cela signifie? –

Répondre

6

Ceci est un exemple sur la façon d'avoir une vue de liste avec la zone de totaux à la fin. La largeur de la colonne sont binded entre chaque colonne et son total de

<Window x:Class="WpfApplication2.Window1" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:sys="clr-namespace:System;assembly=mscorlib" 
     Title="Window1" 
     x:Name="ctl" 
     Height="300" 
     Width="300"> 
    <Window.Resources> 

    <GridViewColumnCollection x:Key="gvcc"> 
     <GridViewColumn Width="{Binding Path=ActualWidth, ElementName=col1}" 
         Header="Date" /> 
     <GridViewColumn Width="{Binding Path=ActualWidth, ElementName=col2}" 
         Header="Day Of Week" 
         DisplayMemberBinding="{Binding DayOfWeek}" /> 
     <GridViewColumn Width="{Binding Path=ActualWidth, ElementName=col3}" 
         Header="Year" 
         DisplayMemberBinding="{Binding Year}" /> 

    </GridViewColumnCollection> 
    </Window.Resources> 

    <Grid> 
    <DockPanel HorizontalAlignment="Stretch" 
       VerticalAlignment="Stretch" 
       LastChildFill="True"> 


     <GridViewRowPresenter Name="listview_total" 
          DockPanel.Dock="Bottom" 
          Margin="0,5,0,5" 
          Columns="{StaticResource gvcc}"> 
     <GridViewRowPresenter.Content> 
      <sys:DateTime>2005/2/1</sys:DateTime> 
     </GridViewRowPresenter.Content> 
     </GridViewRowPresenter> 



     <ListView x:Name="listview_rows" 
       SelectionMode="Single" 
       DockPanel.Dock="Top" 
       ScrollViewer.HorizontalScrollBarVisibility="Disabled"> 
     <ListView.View> 
      <GridView> 
      <GridViewColumn x:Name="col1"        
          Header="Date" /> 
      <GridViewColumn x:Name="col2"        
          Header="Day Of Week" 
          DisplayMemberBinding="{Binding DayOfWeek}" /> 
      <GridViewColumn x:Name="col3"        
          Header="Year" 
          DisplayMemberBinding="{Binding Year}" /> 
      </GridView> 
     </ListView.View> 

     <sys:DateTime>1/2/3</sys:DateTime> 
     <sys:DateTime>4/5/6</sys:DateTime> 
     <sys:DateTime>7/8/9</sys:DateTime> 
     <sys:DateTime>10/11/12</sys:DateTime> 
     <sys:DateTime>1/2/3</sys:DateTime> 
     <sys:DateTime>4/5/6</sys:DateTime> 
     <sys:DateTime>7/8/9</sys:DateTime> 
     <sys:DateTime>10/11/12</sys:DateTime> 
     <sys:DateTime>1/2/3</sys:DateTime> 
     <sys:DateTime>4/5/6</sys:DateTime> 
     <sys:DateTime>7/8/9</sys:DateTime> 
     <sys:DateTime>10/11/12</sys:DateTime> 
     <sys:DateTime>1/2/3</sys:DateTime> 
     <sys:DateTime>4/5/6</sys:DateTime> 
     <sys:DateTime>7/8/9</sys:DateTime> 
     <sys:DateTime>10/11/12</sys:DateTime> 
     </ListView> 

    </DockPanel> 
    </Grid> 
</Window> 
0

Il semble presque ce que vous voulez est un deuxième listview en dessous du premier, avec quelques-uns façon de garder les tailles de colonnes en synchronisation. Y at-il un événement que vous pouvez connecter pour vous informer que l'utilisateur a redimensionné une colonne particulière? (Je ne suis pas vraiment une personne de WPF, mais WinForms offre un événement ColumnSizeChanged et ColumnSizeChanging.) C'est un peu grossier, mais à moins de rouler votre propre contrôle listview, je ne sais pas si vous allez faire beaucoup mieux .

+0

Exactement, c'est ce que je cherche .. merci pour l'entrée, je pense qu'il n'y a pas de manière "plus facile"/plus propre (par exemple sans Code-Behind/en utilisant des événements séparés). –

1

Si votre source de données est une source statique, vous pouvez utiliser une collection composite. J'aimerais vraiment que cela fonctionne ailleurs. Triste, vraiment. En tout cas, c'est vraiment bien si vous pouvez l'utiliser.

<ListView> 
    <ListView.ItemsSource> 
     <CompositeCollection> 
      <CollectionContainer Collection="{StaticResource MyCollection} /> 
      <ListViewItem>Last Item</ListViewItem> 
     </CompositeCollection> 
    </ListView.ItemsSource> 
</ListView> 

Profitez-en!

0

bâtiment hors federubin's excellent answer, vous pouvez lier la propriété de ColumnsGridViewRowPresenter directement à la propriété Columns du GridView.

<GridViewRowPresenter Columns="{Binding ElementName=ListViewGridViewName, Path=Columns}" ...> 

Les largeurs colonnes seront automatiquement mises à jour dans le présentateur quand ils sont modifiés dans la grille principale et vous ne plus avoir à dupliquer vos définitions de colonne.

<Window x:Class="WpfTestbed.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:sys="clr-namespace:System;assembly=mscorlib"> 
    <Grid> 
    <DockPanel HorizontalAlignment="Stretch" VerticalAlignment="Stretch" LastChildFill="True"> 

     <GridViewRowPresenter Columns="{Binding ElementName=ListViewGridView, Path=Columns}" DockPanel.Dock="Bottom" Margin="4,5,0,5"> 
     <GridViewRowPresenter.Content> 
      <sys:DateTime>2005/2/1</sys:DateTime> 
     </GridViewRowPresenter.Content> 
     </GridViewRowPresenter> 

     <ListView SelectionMode="Single" ScrollViewer.HorizontalScrollBarVisibility="Disabled"> 
     <ListView.View> 
      <GridView x:Name="ListViewGridView"> 
      <GridViewColumn Header="Date" /> 
      <GridViewColumn Header="Day Of Week" DisplayMemberBinding="{Binding DayOfWeek}" /> 
      <GridViewColumn Header="Year" DisplayMemberBinding="{Binding Year}" /> 
      </GridView> 
     </ListView.View> 

     <sys:DateTime>1/2/3</sys:DateTime> 
     <sys:DateTime>4/5/6</sys:DateTime> 
     <sys:DateTime>7/8/9</sys:DateTime> 
     <sys:DateTime>10/11/12</sys:DateTime> 
     <sys:DateTime>1/2/3</sys:DateTime> 
     <sys:DateTime>4/5/6</sys:DateTime> 
     <sys:DateTime>7/8/9</sys:DateTime> 
     <sys:DateTime>10/11/12</sys:DateTime> 
     <sys:DateTime>1/2/3</sys:DateTime> 
     <sys:DateTime>4/5/6</sys:DateTime> 
     <sys:DateTime>7/8/9</sys:DateTime> 
     <sys:DateTime>10/11/12</sys:DateTime> 
     <sys:DateTime>1/2/3</sys:DateTime> 
     <sys:DateTime>4/5/6</sys:DateTime> 
     <sys:DateTime>7/8/9</sys:DateTime> 
     <sys:DateTime>10/11/12</sys:DateTime> 
     </ListView> 

    </DockPanel> 
    </Grid> 
</Window> 
Questions connexes