Сумма дисплея сгруппированных объектов в ListView

Я создаю приложение 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 и добавлю мои собственные свойства. Но я не уверен, что это будет даже работать. Возможно, существует лучшее решение... какие-либо предложения?

9
задан Brent 6 February 2010 в 04:11
поделиться

2 ответа

Чтобы расширить сказанное 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>

Ура!

19
ответ дан 4 December 2019 в 11:04
поделиться

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

См .:

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

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

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

1
ответ дан 4 December 2019 в 11:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: