代码之家  ›  专栏  ›  技术社区  ›  Brent

在ListView中显示分组项的总和

  •  9
  • Brent  · 技术社区  · 14 年前

    我正在使用MVVM设计模式创建一个WPF时间卡应用程序,我试图显示用户每天打卡的总小时数。我有一个列表视图,其中使用以下XAML将所有时间卡数据分组:

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

    这是可能的吗?起初我以为我会创建CollectionViewGroup的一个部分类,并添加我自己的属性。但我不确定这是否可行。也许还有更好的解决方案…有什么建议吗?

    3 回复  |  直到 9 年前
        1
  •  17
  •   NathanAW    14 年前

    要扩展e.tadeu所说的内容,可以将headerTemplate的数据模板绑定到collectionviewgroup的items属性。这将返回当前组中的所有项目。

    然后,您可以提供一个转换器,它将从该项集合中返回所需的数据。在你的例子中,你说你想要时间的总和。您可以实现这样一个转换器:

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

    然后您可以在数据模板上使用此转换器:

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

    干杯!

        2
  •  1
  •   e.tadeu    14 年前
        3
  •  -1
  •   Nathan Tuggy TonyLuigiC    9 年前

    只需在GroupStyle中使用“itemCount”显示包含项的当前计数,根据此 tutorial on ListView grouping .