更新时间:2022-10-21 12:29:37
如果您寻找的是这样的:
然后就可以使用ContainerStyle的GroupStyle的Template属性。在这个例子中,我使用一个DockPanel中,根据您所提供停靠在底部的网格和项目presenter填充剩余部分。此外,为了获得项目累计完成你必须使用一个转换器,它在底部提供。
<窗口
的xmlns =http://schemas.microsoft.com/winfx/2006/xaml/$p$psentation
的xmlns:X =http://schemas.microsoft.com/winfx/2006/xaml
X:类=WpfApplication1.Window3
X:NAME =窗口
标题=Window3
XMLNS:地方=CLR的命名空间:WpfApplication1
WIDTH =640高度=480>
< Window.Resources>
<地方:MyDataSource X:关键=迈德特/>
< CollectionViewSource X:关键=ViewSource来源={绑定源= {迈德特的StaticResource},路径=用户}>
< CollectionViewSource.GroupDescriptions>
< PropertyGroupDescription属性名=国家/>
< /CollectionViewSource.GroupDescriptions>
< / CollectionViewSource>
< /Window.Resources>
<电网X:名称=LayoutRoot>
< ListView控件的ItemsSource ={绑定源= {的StaticResource ViewSource}}>
< ListView.GroupStyle>
< GroupStyle>
< GroupStyle.ContainerStyle>
<风格的TargetType ={X:类型GroupItem}>
< setter属性=模板>
< Setter.Value>
<的ControlTemplate的TargetType ={X:类型GroupItem}>
< DockPanel中>
<电网DockPanel.Dock =底部>
< Grid.Resources>
<地方:TotalSumConverter X:关键=sumConverter/>
< /Grid.Resources>
< Grid.ColumnDefinitions>
&所述; ColumnDefinition宽度=*/>
&所述; ColumnDefinition宽度=*/>
< /Grid.ColumnDefinitions>
< Grid.RowDefinitions>
< RowDefinition />
< RowDefinition />
< /Grid.RowDefinitions>
< StackPanel的方向=横向>
< TextBlock的Grid.Column =0文本=总计:粗细=大胆/>
< TextBlock的Grid.Column =0文本={绑定路径=名}/>
< / StackPanel的>
<线Grid.Column =1行程=黑X2 =500补=黑VerticalAlignment =中心/>
< TextBlock的Grid.Row =1Grid.Column =1的HorizontalAlignment =右文本={绑定路径=项,转换器= {的StaticResource sumConverter}}/>
< /网格>
<项目presenter />
< / DockPanel中>
< /控件模板>
< /Setter.Value>
< /二传手>
< /样式和GT;
< /GroupStyle.ContainerStyle>
< / GroupStyle>
< /ListView.GroupStyle>
< ListView.View>
< GridView控件>
< GridViewColumn WIDTH =140标题=名称DisplayMemberBinding ={结合名}/>
< GridViewColumn WIDTH =140标题=电话号码DisplayMemberBinding ={结合电话}/>
< GridViewColumn WIDTH =140标题=国家DisplayMemberBinding ={结合国家}/>
< GridViewColumn WIDTH =140标题=总DisplayMemberBinding ={结合共}/>
< / GridView的>
< /ListView.View>
< / ListView控件>
< /网格>
< /窗>
公共类MyDataSource
{
公众的ObservableCollection<使用者>用户{获得;组; }
公共MyDataSource()
{
用户=新的ObservableCollection<使用者>();
LoadDummyData();
}
私人无效LoadDummyData()
{
Users.Add(新用户()
{
NAME =弗兰克,
手机=(122)555-1234
国家=美国,
总计= 432
});
Users.Add(新用户()
{
NAME =鲍勃,
手机=(212)555-1234
国家=美国,
总计= 456
});
Users.Add(新用户()
{
NAME =马克,
手机=(301)555-1234
国家=美国,
总计= 123
});
Users.Add(新用户()
{
NAME =皮埃尔
手机=+33(122)555-1234
国家=法国,
总计= 333
});
Users.Add(新用户()
{
NAME =雅克
手机=+33(122)555-1234
国家=法国,
总计= 222
});
Users.Add(新用户()
{
NAME =奥利弗,
手机=+33(122)555-1234
国家=法国,
总计= 444
});
}
}
公共类用户
{
公共字符串名称{;组; }
公共字符串电话{获得;组; }
公共字符串国家{获得;组; }
公共双共{获得;组; }
}
公共类TotalSumConverter:的IValueConverter
{
公共对象转换(对象的值,类型TARGETTYPE,对象参数,CultureInfo的文化)
{
VAR用户=价值为IEnumerable<对象&gt ;;
如果(用户== NULL)
返回$ 0.00;
双总和= 0;
的foreach(在用户变种U)
{
总和+ =((用户)U)。总;
}
返回sum.ToString(C);
}
公共对象ConvertBack(对象的值,类型TARGETTYPE,对象参数,CultureInfo的文化)
{
抛出新System.NotImplementedException();
}
}
I have a ListView that displays sales orders, and groups them by status. In WinForms I had a footer at the bottom of each group that displayed the Total sale price for each group, and I would like to do the same in WPF.
I have figured out how to group the orders, but I can't figure out how to create a footer.
This is my current group style:
<ListView.GroupStyle>
<GroupStyle HidesIfEmpty="True">
<GroupStyle.HeaderTemplate>
<DataTemplate>
<!--CollectionViewGroup.Name will be assigned the value of Status for that group.-->
<!--http://***.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>
If your looking for something like this:
Then you can use the Template property of the ContainerStyle for the GroupStyle. In this example I use a DockPanel, with the Grid you supplied Docked on the bottom and an ItemsPresenter filling the remainder. In addition in order to get the Items totaled you'd have to use a Converter, which is supplied at the bottom.
<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>
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
});
}
}
public class User
{
public string Name { get; set; }
public string Phone { get; set; }
public string Country { get; set; }
public double Total { get; set; }
}
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();
}
}