2014-07-07 8 views
6

Mam DataGrid, która jest zobowiązana do zbierania i że chcę być zgrupowane. Oto kodGrupowanie DataGrid WPF z sumami i innymi polami

Kolekcja:

private string _ID; 
private string _Descript; 
private decimal _Amount; 
public string ID 
{ 
    get { return _ID; } 
    set { _ID = value; NotifyPropertyChanged("ID"); } 
} 
public decimal Amount 
{ 
    get { return _Amount; } 
    set { _Amount = value; NotifyPropertyChanged("Amount"); } 
} 
public string Descript 
{ 
    get { return _Descript; } 
    set { _Descript = value; NotifyPropertyChanged("Descript"); } 
    } 

C#;

ListCollectionView groupcollection = new ListCollectionView(myCollection); 
groupcollection.GroupDescriptions.Add(new PropertyGroupDescription("ID")); 
myDataGrid.ItemsSource = groupcollection; 

XAML:

<DataGrid Name="myDataGrid"> 
<DataGrid.GroupStyle> 
    <GroupStyle> 
     <GroupStyle.HeaderTemplate> 
      <DataTemplate> 
       <StackPanel> 
        <TextBlock Text="{Binding Path=Name}" /> 
       </StackPanel> 
      </DataTemplate> 
     </GroupStyle.HeaderTemplate> 
     <GroupStyle.ContainerStyle> 
      <Style TargetType="{x:Type GroupItem}"> 
       <Setter Property="Template"> 
        <Setter.Value> 
         <ControlTemplate TargetType="{x:Type GroupItem}"> 
          <Expander> 
           <Expander.Header> 
            <StackPanel Orientation="Horizontal"> 
             <TextBlock Text="{Binding Path=Name}" Margin="5"/> 
             <TextBlock Text="Count" Margin="5" /> 
             <TextBlock Text="{Binding Path=ItemCount}" Margin="5"/> 
            </StackPanel> 
           </Expander.Header> 
           <ItemsPresenter /> 
          </Expander> 
         </ControlTemplate> 
        </Setter.Value> 
       </Setter> 
      </Style> 
     </GroupStyle.ContainerStyle> 
    </GroupStyle> 
</DataGrid.GroupStyle> 

Działa to doskonale, ale teraz w Expander.Header Chcę dodał streszczenia na "ilość" i "descript" wartości. Na przykład, jeśli w zbiorze znajdują się 3 rekordy o identyfikatorze "ABC", każda z nich ma 20, a opis ABC jako "Mój Licznik" chciałbym zobaczyć;

ABC My Count total 60 

Jak to zrobić?

Odpowiedz

12

Można użyć konwertera, który przekazał właściwość Items nagłówka grupy, np.

<Window.Resources> 
    <local:GroupsToTotalConverter x:Key="groupsConverter" /> 
</Window.Resources> 

<Expander.Header> 
    <StackPanel Orientation="Horizontal"> 
     <TextBlock Text="{Binding Path=Name}" Margin="5"/> 
     <TextBlock Text="total" Margin="5" /> 
     <TextBlock Text="{Binding Path=Items, Converter={StaticResource groupsConverter}}" Margin="5" /> 
    </StackPanel> 

gdzie przetwornica wykonuje obliczenia i przechodzi z powrotem w sumie jako ciąg dla bloku tekstowego:

public class GroupsToTotalConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (value is ReadOnlyObservableCollection<Object>) 
     { 
      var items = (ReadOnlyObservableCollection<Object>)value; 
      Decimal total = 0; 
      foreach (GroupItem gi in items) 
      { 
       total += gi.Amount; 
      } 
      return total.ToString(); 
     } 
     return ""; 
    } 

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

Co do opisu Sugerowałbym również grupowanie przez to, i napisanie kolejnego konwertera, aby wyciągnąć opis z Przedmiotów w podobny sposób jak powyżej.