2014-07-07 9 views
6

Koleksiyona bağlı ve gruplanmak istediğim bir DataGrid sahibim. İşte kodWPF DataGrid Toplamlar ve diğer alanlarla gruplandırma

Koleksiyonu:

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: Bu Expander.Header mükemmel ama şimdi çalışıyor

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

İstiyorum bir "tutar" ve "Descript" değerinin bir özetini ekledi. Örneğin, "ABC" kimliğine sahip koleksiyonda her biri 20 olmak üzere 3 kayıt varsa ve ABC'nin "My Count" olduğu açıklamasını görmek isterim;

ABC My Count total 60 

Bunu nasıl yaparım?

cevap

12

Grup başlığının Items özelliğini geçen bir dönüştürücü kullanabilirsiniz.

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

dönüştürücü hesaplama yapar ve metin bloğu için dize olarak toplam geri verir

: Ayrıca bu göre gruplama öneririz açıklaması için de

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

, ve Öğeler'den açıklamayı yukarıdaki gibi benzer bir şekilde çıkarmak için başka bir dönüştürücü yazma.