Я создаю приложение 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 и добавлю мои собственные свойства. Но я не уверен, что это будет даже работать. Возможно, существует лучшее решение... какие-либо предложения?
Чтобы расширить сказанное 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>
Ура!
Используйте конвертер.
См .:
http://www.codeproject.com/KB/WPF/WPFAggregateConverter.aspx
Это тоже может вам помочь: