【问题标题】:WPF ListView Headers RepositioningWPF ListView 标题重新定位
【发布时间】:2017-12-29 23:12:14
【问题描述】:

我有一个ListView(带有一个内部ListView),它显示如下数据:

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

是否可以如图所示重新定位列标题,或者只是在外部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>

【问题讨论】:

    标签: c# wpf listview


    【解决方案1】:

    这是我想出的,而不是我自己想出的,我使用了我的谷歌 fu 技能。
    感谢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
        }
    }
    

    然后产生这个结果:

    【讨论】:

      猜你喜欢
      • 2011-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多