且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

如何创建一个WPF的ListView组页脚(GridView控件)

更新时间:2022-10-21 12:29:37

如果您寻找的是这样的:

如何创建一个WPF的ListView组页脚(GridView控件)

然后就可以使用ContainerStyle的GroupStyle的Template属性。在这个例子中,我使用一个DockPanel中,根据您所提供停靠在底部的网格和项目presenter填充剩余部分。此外,为了获得项目累计完成你必须使用一个转换器,它在底部提供。

Window.xaml

 <窗​​口
    的xmlns =htt​​p://schemas.microsoft.com/winfx/2006/xaml/$p$psentation
    的xmlns:X =htt​​p://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.GroupDesc​​riptions>
                < PropertyGroupDesc​​ription属性名=国家/>
            < /CollectionViewSource.GroupDesc​​riptions>
        < / CollectionViewSource>
    < /Window.Resources>
    <电网X:名称=LayoutRoot>
      < ListView控件的ItemsSource ={绑定源= {的StaticResource ViewSource}}>
        < ListView.GroupStyle>
            < GroupStyle>
                < GroupStyle.ContainerStyle>
                    <风格的TargetType ={X:类型GroupItem}>
                        < setter属性=模板>
                            < Setter.Value>
                                <的ControlTemplate的TargetType ={X:类型GroupItem}>
                                      < D​​ockPanel中>
                                        <电网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的Horizo​​ntalAlignment =右文本={绑定路径=项,转换器= {的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.cs

 公共类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
        });
    }
}
 

User.cs

 公共类用户
{
    公共字符串名称{;组; }
    公共字符串电话{获得;组; }
    公共字符串国家{获得;组; }
    公共双共{获得;组; }
}
 

TotalSumConverter.cs

 公共类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.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();
    }
}