2010-02-06 12 views
9

Sto creando un'app di WCard TimeP utilizzando il modello di progettazione MVVM e sto tentando di visualizzare la somma (totale) di ore in cui l'utente ha effettuato il clock raggruppato per ogni giorno. Ho un ListView con tutti i dati TimeCard rotto in gruppi utilizzando il seguente XAML:Visualizzazione della somma di elementi raggruppati in ListView

<ListView.GroupStyle> 
    <GroupStyle ContainerStyle="{StaticResource GroupItemStyle}"> 
     <GroupStyle.HeaderTemplate> 
      <DataTemplate> 
       <StackPanel Orientation="Horizontal"> 
        <TextBlock Text="{Binding Path=Name, StringFormat=\{0:D\}}" FontWeight="Bold"/> 
        <TextBlock Text=" (" FontWeight="Bold"/> 
        <!-- This needs to display the sum of the hours --> 
        <TextBlock Text="{Binding ???}" FontWeight="Bold"/> 
        <TextBlock Text=" hours)" FontWeight="Bold"/> 
       </StackPanel> 
      </DataTemplate> 
     </GroupStyle.HeaderTemplate> 
    </GroupStyle> 
</ListView.GroupStyle> 

Questo è anche possibile? All'inizio pensavo di creare una classe parziale di CollectionViewGroup e aggiungere le mie proprietà. Ma non sono sicuro che funzionerà. Forse c'è una soluzione migliore ... qualche suggerimento?

risposta

17

Per espandere su ciò e.tadeu Detto questo, è possibile associare DataTemplate del HeaderTemplate alla proprietà Items di il CollectionViewGroup. Ciò ti restituirà tutti gli elementi presenti nel gruppo corrente.

Quindi è possibile fornire un convertitore che restituirà i dati desiderati da quella raccolta di articoli. Nel tuo caso, dici di volere la somma delle ore. Si potrebbe implementare un convertitore che fa qualcosa di simile:

public class GroupHoursConverter : IValueConverter 
{ 

    public object Convert(object value, System.Type targetType, 
          object parameter, 
          System.Globalization.CultureInfo culture) 
    { 
     if (null == value) 
      return "null"; 

     ReadOnlyObservableCollection<object> items = 
       (ReadOnlyObservableCollection<object>)value; 

     var hours = (from i in items 
        select ((TimeCard)i).Hours).Sum(); 

     return "Total Hours: " + hours.ToString(); 
    } 

    public object ConvertBack(object value, System.Type targetType, 
           object parameter, 
           System.Globalization.CultureInfo culture) 
    { 
     throw new System.NotImplementedException(); 
    } 
} 

allora si potrebbe utilizzare questo convertitore sul modello di dati:

<Window.Resources> 
     <local:GroupHoursConverter x:Key="myConverter" /> 
    </Window.Resources> 

    <ListView.GroupStyle> 
     <GroupStyle ContainerStyle="{StaticResource GroupItemStyle}"> 
      <GroupStyle.HeaderTemplate> 
       <DataTemplate> 
        <StackPanel Orientation="Horizontal"> 
         <TextBlock Text="{Binding Path=Name, 
                StringFormat=\{0:D\}}" 
            FontWeight="Bold"/> 
         <TextBlock Text=" (" FontWeight="Bold"/> 
         <!-- This needs to display the sum of the hours --> 
         <TextBlock Text="{Binding Path=Items, 
             Converter={StaticResource myConverter}}" 
            FontWeight="Bold"/> 
         <TextBlock Text=" hours)" FontWeight="Bold"/> 
        </StackPanel> 
       </DataTemplate> 
      </GroupStyle.HeaderTemplate> 
     </GroupStyle> 
    </ListView.GroupStyle> 

Cheers!

+0

Grazie! Ho sempre dimenticato tutte le cose che puoi fare con ValueConverters. Grazie per il codice di esempio. – Brent

+0

Questo non funzionerà se i valori cambiano. –

Problemi correlati