2010-02-06 25 views
9

Estoy creando una aplicación WPF TimeCard utilizando el patrón de diseño de MVVM, y estoy tratando de mostrar la suma (total) de horas que el usuario ha registrado agrupado por día. He un ListView con todos los datos TimeCard roto en grupos utilizando el siguiente XAML:Mostrar la suma de elementos agrupados en 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> 

Es esto posible? Al principio pensé que crearía una clase parcial de CollectionViewGroup y agregaría mis propias propiedades. Pero no estoy seguro de que esto funcione. Tal vez hay una solución mejor ... ¿alguna sugerencia?

Respuesta

17

Para ampliar lo e.tadeu Dicho esto, puede unirse DataTemplate de su HeaderTemplate a la propiedad Items de el CollectionViewGroup. Esto le devolverá todos los elementos que están en el grupo actual.

Luego puede suministrar un convertidor que le devolverá los datos deseados de esa colección de artículos. En tu caso, dices que quieres la suma de las horas. Se podría implementar un convertidor que hace algo como:

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(); 
    } 
} 

Posteriormente, se podría utilizar este convertidor en su plantilla de datos:

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

Salud!

+0

Gracias! Siempre me olvido de todo lo que puedes hacer con ValueConverters. Gracias por el código de muestra. – Brent

+0

Esto no funcionará si los valores cambian. –

Cuestiones relacionadas