modern - wpf styles templates
¿Cómo puedo crear un pie de página de grupo en un WPF ListView(GridView) (1)
Si buscas algo como esto:
Agrupación WPF con sumas totales http://www.bendewey.com/code/GroupingSum.png
Luego puede usar la propiedad Template del ContainerStyle para GroupStyle. En este ejemplo, utilizo un DockPanel, con la cuadrícula que ha proporcionado en la parte inferior y un ItemsPresenter en el resto. Además, para obtener los artículos totalizados, tendría que usar un convertidor, que se suministra en la parte inferior.
Window.xaml
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="WpfApplication1.Window3"
x:Name="Window"
Title="Window3"
xmlns:local="clr-namespace:WpfApplication1"
Width="640" Height="480">
<Window.Resources>
<local:MyDataSource x:Key="MyData" />
<CollectionViewSource x:Key="ViewSource" Source="{Binding Source={StaticResource MyData}, Path=Users}">
<CollectionViewSource.GroupDescriptions>
<PropertyGroupDescription PropertyName="Country" />
</CollectionViewSource.GroupDescriptions>
</CollectionViewSource>
</Window.Resources>
<Grid x:Name="LayoutRoot">
<ListView ItemsSource="{Binding Source={StaticResource ViewSource}}">
<ListView.GroupStyle>
<GroupStyle>
<GroupStyle.ContainerStyle>
<Style TargetType="{x:Type GroupItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type GroupItem}">
<DockPanel>
<Grid DockPanel.Dock="Bottom">
<Grid.Resources>
<local:TotalSumConverter x:Key="sumConverter" />
</Grid.Resources>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<StackPanel Orientation="Horizontal">
<TextBlock Grid.Column="0" Text="Total: " FontWeight="Bold"/>
<TextBlock Grid.Column="0" Text="{Binding Path=Name}" />
</StackPanel>
<Line Grid.Column="1" Stroke="Black" X2="500" Fill="Black" VerticalAlignment="Center" />
<TextBlock Grid.Row="1" Grid.Column="1" HorizontalAlignment="Right" Text="{Binding Path=Items, Converter={StaticResource sumConverter}}" />
</Grid>
<ItemsPresenter />
</DockPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</GroupStyle.ContainerStyle>
</GroupStyle>
</ListView.GroupStyle>
<ListView.View>
<GridView>
<GridViewColumn Width="140" Header="Name" DisplayMemberBinding="{Binding Name}"/>
<GridViewColumn Width="140" Header="Phone Number" DisplayMemberBinding="{Binding Phone}"/>
<GridViewColumn Width="140" Header="Country" DisplayMemberBinding="{Binding Country}" />
<GridViewColumn Width="140" Header="Total" DisplayMemberBinding="{Binding Total}" />
</GridView>
</ListView.View>
</ListView>
</Grid>
</Window>
MyDataSource.cs
public class MyDataSource
{
public ObservableCollection<User> Users { get; set; }
public MyDataSource()
{
Users = new ObservableCollection<User>();
LoadDummyData();
}
private void LoadDummyData()
{
Users.Add(new User()
{
Name = "Frank",
Phone = "(122) 555-1234",
Country = "USA",
Total = 432
});
Users.Add(new User()
{
Name = "Bob",
Phone = "(212) 555-1234",
Country = "USA",
Total = 456
});
Users.Add(new User()
{
Name = "Mark",
Phone = "(301) 555-1234",
Country = "USA",
Total = 123
});
Users.Add(new User()
{
Name = "Pierre",
Phone = "+33 (122) 555-1234",
Country = "France",
Total = 333
});
Users.Add(new User()
{
Name = "Jacques",
Phone = "+33 (122) 555-1234",
Country = "France",
Total = 222
});
Users.Add(new User()
{
Name = "Olivier",
Phone = "+33 (122) 555-1234",
Country = "France",
Total = 444
});
}
}
User.cs
public class User
{
public string Name { get; set; }
public string Phone { get; set; }
public string Country { get; set; }
public double Total { get; set; }
}
TotalSumConverter.cs
public class TotalSumConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var users = value as IEnumerable<object>;
if (users == null)
return "$0.00";
double sum = 0;
foreach (var u in users)
{
sum += ((User)u).Total;
}
return sum.ToString("c");
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new System.NotImplementedException();
}
}
Tengo un ListView que muestra los pedidos de venta y los agrupa por estado. En WinForms tenía un pie de página en la parte inferior de cada grupo que mostraba el precio de venta total para cada grupo, y me gustaría hacer lo mismo en WPF.
He descubierto cómo agrupar los pedidos, pero no puedo entender cómo crear un pie de página.
Este es mi estilo grupal actual:
<ListView.GroupStyle>
<GroupStyle HidesIfEmpty="True">
<GroupStyle.HeaderTemplate>
<DataTemplate>
<!--CollectionViewGroup.Name will be assigned the value of Status for that group.-->
<!--http://stackoverflow.com/questions/639809/how-do-i-group-items-in-a-wpf-listview-->
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="{Binding Path=Name}" HorizontalAlignment="Left" FontWeight="Bold" Foreground="Black"/>
<Line Grid.Column="1" Stroke="Black" X2="500" Fill="Black" VerticalAlignment="Center" />
</Grid>
</DataTemplate>
</GroupStyle.HeaderTemplate>
</GroupStyle>
</ListView.GroupStyle>