Показать сумму сгруппированных элементов в ListView - PullRequest
9 голосов
/ 06 февраля 2010

Я создаю приложение WPF TimeCard, используя шаблон проектирования MVVM, и пытаюсь отобразить суммарную (общую) продолжительность часов, сгруппированных пользователем за день У меня есть ListView со всеми данными TimeCard, разбитыми на группы, используя следующий 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 ]

19 голосов
/ 10 февраля 2010

Чтобы расширить то, что сказал e.tadeu, вы можете связать DataTemplate вашего HeaderTemplate со свойством Items CollectionViewGroup. Это вернет вам все предметы, которые находятся в текущей группе.

Затем вы можете предоставить конвертер, который вернет вам необходимые данные из этой коллекции предметов. В вашем случае вы говорите, что хотите сумму часов. Вы могли бы реализовать конвертер, который делает что-то вроде:

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>

ура!

1 голос
/ 10 февраля 2010

Используйте конвертер.

См .:

http://www.codeproject.com/KB/WPF/WPFAggregateConverter.aspx

Это также может вам помочь:

http://www.codeproject.com/KB/WPF/DsxGridCtrl.aspx

0 голосов
/ 28 октября 2015

Просто используйте "ItemCount" в GroupStyle, чтобы показать текущее количество содержащихся элементов, согласно этому учебнику по группировке ListView .

...