style modern for wpf .net-3.5 styles

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>