WPF ListView标头重新定位

时间:2017-12-29 23:12:15

标签: c# wpf listview

我有ListView(内部ListView),显示如下数据:

enter image description here

我想在分组上方显示内部ListView标题,如下所示:

enter image description here

是否可以如图所示重新定位列标题,或者只是在外部ListView上创建一些假标题?

这是我到目前为止的XAML代码:

<ListView Name="ListView_GarnishmentCalculations"
          ItemsSource="{Binding GarnishedEmployees, UpdateSourceTrigger=PropertyChanged}"
          MaxHeight="{Binding ActualHeight, 
              RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ScrollContentPresenter}}, 
              Converter={StaticResource MathConverter}, ConverterParameter=x-220}"
          Margin="5,20,10,10"
          ScrollViewer.CanContentScroll="True"
          ScrollViewer.VerticalScrollBarVisibility="Auto"
          Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="4">

    <!-- Required for right justifying text in a TextBlock -->
    <ListView.ItemContainerStyle>
        <Style TargetType="ListViewItem">
            <Setter Property="HorizontalContentAlignment" Value="Stretch" />
        </Style>
    </ListView.ItemContainerStyle>

    <!-- Group results and show EmpNo, Name and WorkState -->
    <ListView.GroupStyle>
        <GroupStyle>
            <GroupStyle.HeaderTemplate>
                <DataTemplate>
                    <Grid ShowGridLines="False">
                       <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="50" />
                            <ColumnDefinition Width="175" />
                            <ColumnDefinition Width="50" />
                        </Grid.ColumnDefinitions>
                        <TextBlock Text="{Binding Items[0].EmpNo}"
                                   FontWeight="Bold"
                                   Grid.Column="0" />
                        <TextBlock Text="{Binding Items[0].FullName}"
                                   FontWeight="Bold"
                                   Grid.Column="1" />
                        <TextBlock Text="{Binding Items[0].WorkState}"
                                   FontWeight="Bold"
                                   Grid.Column="2" />
                    </Grid>
                </DataTemplate>
            </GroupStyle.HeaderTemplate>
        </GroupStyle>
    </ListView.GroupStyle>

    <ListView.ItemTemplate>
    <DataTemplate>

        <!-- Inner ListView of garnishment details -->
        <ListView ItemsSource="{Binding Garnishments}">

            <ListView.View>
                <GridView>

                    <!-- CaseID -->
                    <GridViewColumn Width="100">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding CaseNumber, Converter={StaticResource StringIsNullOrEmptyConverter}, ConverterParameter='No Case ID'}"
                                           TextAlignment="Left">
                                </TextBlock>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                        <GridViewColumn.Header>
                            <GridViewColumnHeader Content=" Case ID" />
                        </GridViewColumn.Header>
                    </GridViewColumn>

                    <!-- Vendor -->
                    <GridViewColumn Width="150"
                                    DisplayMemberBinding="{Binding Vendor}">
                        <GridViewColumn.Header>
                            <GridViewColumnHeader Content=" Vendor" />
                        </GridViewColumn.Header>
                    </GridViewColumn>
                    </GridView>
                </ListView.View>
            </ListView>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

1 个答案:

答案 0 :(得分:1)

这就是我想出的,而不是我的自我,我使用了我的谷歌技能。
相信这个SO post 所以我的模型就是这样:

namespace Model
{
    public class Case
    {
        public int CaseID { get; set; }
        public int Vendor { get; set; }
    }
}  

现在用户:

namespace Model
{
    public class User
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public string State { get; set; }
        public List<Case> Cases { get; set; }
    }
}  

现在在我的MainViewModel中:

using Model;
using System.Collections.Generic;

namespace VM
{
    public class MainViewModel : BaseViewModel
    {
        public MainViewModel()
        {
            Users = new List<User>();
            for (int i = 0; i < 20000; i++)
            {
                Users.Add(new User
                {
                    ID = i,
                    Name = $"John the {i + 1}",
                    State = i % 2 == 0 ? "CA" : "IL",
                    Cases = new List<Case>() { new Case { CaseID = (i + 1) * 10, Vendor = ((i + 1) * 10) - 2 }, new Case { CaseID = (i + 1) * 10, Vendor = ((i + 1) * 10) - 2 } }
                });
            }
        }

        private List<User> users;

        public List<User> Users
        {
            get { return users; }
            set { users = value; OnPropertyChanged(); }
        }
    }
}  

进入视图:

<Window x:Class="SO_App.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:vm="clr-namespace:VM;assembly=VM"
    xmlns:model="clr-namespace:Model;assembly=Model"
    xmlns:local="clr-namespace:SO_App"
    mc:Ignorable="d"
    Title="MainWindow" Height="350" Width="525">
<Window.DataContext>
    <vm:MainViewModel/>
</Window.DataContext>
<Window.Resources>
    <CollectionViewSource Source="{Binding Users}" x:Key="Users"/>
</Window.Resources>
<Grid>
    <ListView>
        <ListView.ItemsSource>
            <CompositeCollection>
                <CollectionContainer Collection="{Binding Source={StaticResource Users}}"/>
            </CompositeCollection>
        </ListView.ItemsSource>
        <ListView.View>
            <GridView>
                <GridViewColumn Header="Case ID" Width="100"/>
                <GridViewColumn Header="Vendor" Width="100"/>
            </GridView>
        </ListView.View>
        <ListView.ItemContainerStyle>
            <Style TargetType="ListViewItem">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="ListViewItem">
                            <ContentPresenter/>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </ListView.ItemContainerStyle>
        <ListView.ItemTemplate>
            <DataTemplate>
                <DataTemplate.Resources>
                    <Style TargetType="TextBlock">
                        <Setter Property="FontWeight" Value="Bold"/>
                    </Style>
                </DataTemplate.Resources>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition/>
                        <ColumnDefinition/>
                        <ColumnDefinition/>
                    </Grid.ColumnDefinitions>
                    <Grid.RowDefinitions>
                        <RowDefinition/>
                        <RowDefinition/>
                    </Grid.RowDefinitions>
                    <TextBlock Text="{Binding ID}" MinWidth="50"/>
                    <TextBlock Text="{Binding Name}" MinWidth="250" Grid.Column="1"/>
                    <TextBlock Text="{Binding State}" MinWidth="50" Grid.Column="2"/>
                    <ListView Grid.Row="1" ItemsSource="{Binding Cases}" Grid.ColumnSpan="3">
                        <ListView.ItemTemplate>
                            <DataTemplate>
                                <Grid>
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition/>
                                        <ColumnDefinition/>
                                    </Grid.ColumnDefinitions>
                                    <TextBlock Text="{Binding CaseID}" MinWidth="100"/>
                                    <TextBlock Text="{Binding Vendor}" MinWidth="100" Grid.Column="1"/>
                                </Grid>
                            </DataTemplate>
                        </ListView.ItemTemplate>
                    </ListView>
                </Grid>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</Grid>


警告:
您将需要处理内部ListView上的滚动事件,因此它不会吞下鼠标滚动 附:
这是BaseViewModel实现:

using System.ComponentModel;
using System.Runtime.CompilerServices;

namespace VM
{
    public class BaseViewModel : INotifyPropertyChanged
    {

        #region INPC
        public event PropertyChangedEventHandler PropertyChanged; 

        protected virtual void OnPropertyChanged([CallerMemberName] string prop = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(prop));
        }
        #endregion
    }
}

然后产生这个结果:
Finished product