【问题标题】:How to add all the column values of grouped rows in data grid row header如何在数据网格行标题中添加分组行的所有列值
【发布时间】:2016-03-09 05:21:58
【问题描述】:

我试图在这个 WPF 应用程序中实现的是总结列“大小”的所有值,该列按页眉上的家庭分组。数据网格中是否有任何方法可以对特定类别下分组的所有行的列进行求和?

XAML

<Window.Resources>
    <Style x:Key="GroupHeaderStyle" TargetType="{x:Type GroupItem}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type GroupItem}">
                    <Expander x:Name="exp" IsExpanded="False" Background="White" Foreground="Black">
                        <Expander.Header>
                            <StackPanel Orientation="Horizontal">
                                <TextBlock Text="{Binding Name}" />
                                <TextBlock Name="TotalSize" Text="Total size here"  Margin="290 0 0 0" />
                            </StackPanel>
                        </Expander.Header>
                        <ItemsPresenter Margin="20 0 0 0" />
                    </Expander>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Window.Resources>

C#

public partial class MainWindow : Window        
{      
    ObservableCollection<DownloadManager> dManager = new ObservableCollection<DownloadManager>();

    public MainWindow()
    {
        InitializeComponent();
        XmlDocument doc = new XmlDocument();
        doc.Load("dm.xml");
        XmlNodeList xnList = doc.SelectNodes("/root/repository/MEDIA");

        foreach (XmlNode media in xnList)
        {
            string PRODUCT = media["PRODUCT"].InnerText;
            string SIZE = media["SIZE"].InnerText;
            string MEDIASTATUS = media["MEDIASTATUS"].InnerText;
            string FAMILY = media["FAMILY"].InnerText;
            dManager.Add(new DownloadManager { Name = PRODUCT, Size = SIZE, Description = MEDIASTATUS, Family = FAMILY });
        }

        ListCollectionView collection = new ListCollectionView(dManager);
        collection.GroupDescriptions.Add(new PropertyGroupDescription("Family"));
        dataGrid.ItemsSource = collection;             
    }
}

public class DownloadManager
{
    public string Name { get; set; }
    public string Size { get; set; }
    public string Description { get; set; }
    public string Family { get; set; }
}

XML

<root>
  <repository >
    <MEDIA>
      <PRODUCT>MS Office</PRODUCT>
      <FAMILY>Paid</FAMILY>
      <SIZE>1056</SIZE>
      <MEDIASTATUS>LIVE</MEDIASTATUS>
    </MEDIA>

    <MEDIA>
      <PRODUCT>Matlab</PRODUCT>
      <FAMILY>Paid</FAMILY>
      <SIZE>2096</SIZE>
      <MEDIASTATUS>LIVE</MEDIASTATUS>
    </MEDIA>

    <MEDIA>
      <PRODUCT>Winzip</PRODUCT>
      <FAMILY>Free</FAMILY>
      <SIZE>119</SIZE>
      <MEDIASTATUS>LIVE</MEDIASTATUS>
    </MEDIA>

    <MEDIA>
      <PRODUCT>Team Viewer</PRODUCT>
      <FAMILY>Free</FAMILY>
      <SIZE>256</SIZE>
      <MEDIASTATUS>LIVE</MEDIASTATUS>
    </MEDIA>

    <MEDIA>
      <PRODUCT>Coral Draw</PRODUCT>
      <FAMILY>Paid</FAMILY>
      <SIZE>3110</SIZE>
      <MEDIASTATUS>LIVE</MEDIASTATUS>
    </MEDIA>

    <MEDIA>
      <PRODUCT>Photoshop</PRODUCT>
      <FAMILY>Free</FAMILY>
      <SIZE>2056</SIZE>
      <MEDIASTATUS>LIVE</MEDIASTATUS>
    </MEDIA>

  </repository>
</root>

【问题讨论】:

  • 使用{Binding ItemCount} 代替“此处的总大小”。 :-)
  • @XAMlMAX :项目数,计算行数。我需要列“大小”的总和
  • 每个组的列大小相同,您需要的是特定列内的字符串长度。您需要更新您的问题,因为它具有误导性。
  • @XAMlMAX “汇总列'size'的所有值”不清楚? IE。 Paid Total size = 1056 + 2096 + 3110Free Total size = 119 + 256 + 2056
  • @OhBeWise 那是因为我误读了这个问题。正如你在我之前的评论中看到的那样。

标签: c# wpf wpfdatagrid


【解决方案1】:

我能想到的最简洁的解决方案是创建一个 Converter 类 - 实现 Convert 方法来循环分组项目,对 Size 值求和,并根据需要格式化返回字符串:

public class SumGroupConverter : IValueConverter
{
     public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
     {
          GroupItem groupItem = value as GroupItem;
          CollectionViewGroup collectionViewGroup = groupItem.Content as CollectionViewGroup;
          int sum = 0;

          foreach (var item in collectionViewGroup.Items)
          {
              DownloadManager dman = item as DownloadManager;
              int size = 0;
              int.TryParse(dman.Size, out size);
              sum += size;
          }

          return string.Format("Total size: {0}", sum);
      }

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

然后,假设您的 xaml 中有一行如 xmlns:local="clr-namespace:WpfApplication1",那么您可以将以下内容添加到您的 Window.Resources

<local:SumGroupConverter x:Key="SumTitle"/>

对于TextBox 内的Expander

<TextBlock 
    Name="TotalSize" 
    Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type GroupItem}}, Converter={StaticResource ResourceKey=SumTitle}}"  
    Margin="290 0 0 0"/>

结果:

【讨论】:

  • 谢谢。它就像一个魅力。接受您的答案将在 5 小时后点赞。
  • 不客气,感谢您提供完整的代码示例 - 让它变得容易多了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-04
  • 1970-01-01
相关资源
最近更新 更多