2010-02-06 7 views
9

Ich erstelle eine WPF TimeCard-App mit dem MVVM-Entwurfsmuster, und ich versuche, die Summe (Gesamt) Stunden, die der Benutzer getaktet hat, nach jedem Tag anzuzeigen. Ich habe ein Listview mit all den Timecard Daten in Gruppen aufgeteilt, die folgende XAML:Summe der gruppierten Elemente in ListView anzeigen

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

Ist das überhaupt möglich? Zuerst dachte ich, ich würde eine partielle Klasse der CollectionViewGroup erstellen und meine eigenen Eigenschaften hinzufügen. Aber ich bin mir nicht sicher, ob das überhaupt funktioniert. Vielleicht gibt es eine bessere Lösung ... irgendwelche Vorschläge?

Antwort

17

zu erweitern, was die e.tadeu, Sie Header der Datatemplate auf die Eigenschaft Items binden kann die CollectionViewGroup. Dadurch erhalten Sie alle Elemente der aktuellen Gruppe zurück.

Dann können Sie einen Konverter liefern, der Ihnen die gewünschten Daten aus dieser Sammlung von Artikeln zurückgibt. In Ihrem Fall sagen Sie, Sie wollen die Summe der Stunden. Sie könnten einen Konverter implementieren, die etwas tut, wie:

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

Dann könnten Sie diesen Konverter auf Ihrer Datenvorlage verwenden:

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

Prost!

+0

Danke! Ich vergesse immer alles, was Sie mit ValueConverters tun können. Danke für den Beispielcode. – Brent

+0

Dies funktioniert nicht, wenn sich die Werte ändern. –