WPF ListView 使用GridView 带有Header 以及点击header排序 sort
ListView:
<ListView x:Name="lvFiles" VerticalAlignment="Stretch" Background="Transparent" Width="Auto" AllowDrop="{Binding IsAllowDrop}" Margin="20,0,20,30"
ScrollViewer.HorizontalScrollBarVisibility="Auto" ScrollViewer.VerticalScrollBarVisibility="Auto"
ButtonBase.Click="ButtonBaseClickedHandler" ItemContainerStyle="{StaticResource ListViewItemStyle}" ItemsSource="{Binding ContentItemsView}"
dnd:DragDropHelper.IsDragSource="True"
local:FileViewStyle.SortDefaultStyle="{StaticResource NormalSortHeaderTemplate}"
local:FileViewStyle.SortAscStyle="{StaticResource AscSortHeaderTemplate}"
local:FileViewStyle.SortDescStyle="{StaticResource DescSortHeaderTemplate}">
<ListView.View>
<GridView ColumnHeaderContainerStyle="{StaticResource GridViewColumnHeader}">
<GridViewColumn Header="{StaticResource IDS_NAME}" x:Name="nameColumn"
HeaderStringFormat="Name" HeaderTemplate="{StaticResource NormalSortHeaderTemplate}"
Width="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ListView}, Converter={StaticResource AutoListViewColumnWidthConverter}}">
<GridViewColumn.CellTemplate>
<DataTemplate >
<DockPanel>
<Image x:Name="img" Width="20" Height="20" Source="{Binding Icon,Converter={StaticResource ImgPathToImageConverter}}"
SnapsToDevicePixels="True" UseLayoutRounding="True"
RenderTransformOrigin="0.5,0.5" Margin="0,0,5,0"></Image>
<customControl:EnhancedTextBlock Text="{Binding Name}" VerticalAlignment="Center" TextTrimming="CharacterEllipsis" />
</DockPanel>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn HeaderStringFormat="Type" HeaderTemplate="{StaticResource NormalSortHeaderTemplate}"
Width="80" Header="{StaticResource IDS_TYPE}" local:RangeColumn.MinWidth="80">
<GridViewColumn.CellTemplate>
<DataTemplate >
<customControl:EnhancedTextBlock Text="{Binding Type}" VerticalAlignment="Center" TextTrimming="CharacterEllipsis" />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn HeaderStringFormat="Size" HeaderTemplate="{StaticResource NormalSortHeaderTemplate}"
Width="80" Header="{StaticResource IDS_SIZE}" local:RangeColumn.MinWidth="80">
<GridViewColumn.CellTemplate>
<DataTemplate >
<customControl:EnhancedTextBlock Text="{Binding SizeStr}" VerticalAlignment="Center" TextTrimming="CharacterEllipsis" />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn HeaderStringFormat="Modified" HeaderTemplate="{StaticResource NormalSortHeaderTemplate}"
Width="120" Header="{StaticResource IDS_MODIFIED}" local:RangeColumn.MinWidth="120">
<GridViewColumn.CellTemplate>
<DataTemplate >
<customControl:EnhancedTextBlock Text="{Binding LastModifyTimeString}" VerticalAlignment="Center" TextTrimming="CharacterEllipsis" />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>
ListViewItemStyle:
<Style x:Key="ListViewItemStyle" TargetType="{x:Type ListViewItem}" BasedOn="{StaticResource {x:Type ListViewItem}}">
<Setter Property="ContextMenu" Value="{StaticResource ItemContextMenu}" />
<Setter Property="IsSelected" Value="{Binding IsSelected}"/>
<Setter Property="Height" Value="22" />
<EventSetter Event="RequestBringIntoView" Handler="ListViewItem_RequestBringIntoView"></EventSetter>
<!--<Setter Property="helper:DragSelectionHelper.IsDragSelecting" Value="False"/>-->
<!--<Style.Triggers>
<Trigger Property="ListBoxItem.IsMouseOver" Value="True">
<Setter Property="helper:DragSelectionHelper.IsDragSelecting" Value="True" />
</Trigger>
</Style.Triggers>-->
</Style>
NormalSortHeaderTemplate:
<DataTemplate x:Key="NormalSortHeaderTemplate">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<customControl:EnhancedTextBlock Grid.Column="0" Text="{Binding}"
VerticalAlignment="{TemplateBinding VerticalAlignment}" HorizontalAlignment="Left"
FontWeight="{TemplateBinding TextBlock.FontWeight}" Foreground="{TemplateBinding TextBlock.Foreground}"/>
</Grid>
</DataTemplate>
AscSortHeaderTemplate:
<DataTemplate x:Key="AscSortHeaderTemplate">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<customControl:EnhancedTextBlock Grid.Column="0" Text="{Binding}"
VerticalAlignment="{TemplateBinding VerticalAlignment}"
FontWeight="{TemplateBinding TextBlock.FontWeight}" Foreground="{TemplateBinding TextBlock.Foreground}" />
<Path Grid.Column="1" x:Name="arrow" Margin="0,-6,6,0" VerticalAlignment="{TemplateBinding VerticalAlignment}"
StrokeThickness="1" Fill="#FF4C4A4A" Data="M 5,10 L 15,10 L 10,5 L 5,10" />
</Grid>
</DataTemplate>
DescSortHeaderTemplate:
<DataTemplate x:Key="DescSortHeaderTemplate">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<customControl:EnhancedTextBlock Grid.Column="0" Text="{Binding}" VerticalAlignment="{TemplateBinding VerticalAlignment}"
FontWeight="{TemplateBinding TextBlock.FontWeight}" Foreground="{TemplateBinding TextBlock.Foreground}" />
<Path Grid.Column="1" x:Name="arrow" Margin="0,-6,6,0" VerticalAlignment="{TemplateBinding VerticalAlignment}"
StrokeThickness="1" Fill="#FF4C4A4A" Data="M 5,5 L 10,10 L 15,5 L 5,5" />
</Grid>
</DataTemplate>
GridViewColumnHeader:
<Style x:Key="GridViewColumnHeader" TargetType="{x:Type GridViewColumnHeader}">
<Setter Property="HorizontalContentAlignment" Value="Stretch"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="Foreground" Value="#646464"/>
<Setter Property="Background" Value="#f2f2f2" />
<Setter Property="Height" Value="22" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="GridViewColumnHeader">
<Grid Background="{TemplateBinding Background}">
<Border Name="HeaderBorder">
<ContentPresenter x:Name="HeaderContent" Content="{TemplateBinding Content}" ContentStringFormat="{TemplateBinding ContentStringFormat}"
VerticalAlignment="Center"
Margin="10,0,0,0" RecognizesAccessKey="True"
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
ContentTemplate="{TemplateBinding ContentTemplate}">
</ContentPresenter>
</Border>
<Thumb x:Name="PART_HeaderGripper" HorizontalAlignment="Right" Style="{StaticResource GridViewColumnHeaderGripper}"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
ButtonBaseClickedHandler:
#region sort
/// <summary>
/// last sort header
/// </summary>
GridViewColumnHeader _lastHeaderClicked = null; /// <summary>
/// last sort direction
/// </summary>
ListSortDirection _lastDirection = ListSortDirection.Ascending; void ButtonBaseClickedHandler(object sender, RoutedEventArgs e)
{
#region sort
try
{
GridViewColumnHeader headerClicked =
e.OriginalSource as GridViewColumnHeader; ListSortDirection direction; if (headerClicked != null)
{
if (headerClicked.Column.HeaderStringFormat == null) return;
string header = headerClicked.Column.HeaderStringFormat as string;
if (headerClicked.Role != GridViewColumnHeaderRole.Padding)
{
if (headerClicked != _lastHeaderClicked)
{
direction = ListSortDirection.Descending;
}
else
{
if (_lastDirection == ListSortDirection.Ascending)
{
direction = ListSortDirection.Descending;
}
else
{
direction = ListSortDirection.Ascending;
}
} Sort(header, direction); if (direction == ListSortDirection.Ascending)
{
SetSortStyle(headerClicked.Column, true);
}
else
{
SetSortStyle(headerClicked.Column, false);
} // Remove arrow from previously sorted header
if (_lastHeaderClicked != null && _lastHeaderClicked != headerClicked)
{
//_lastHeaderClicked.Column.HeaderTemplate = null;
_lastHeaderClicked.Column.HeaderTemplate = FileViewStyle.GetSortDefaultStyle(lvFiles);
} _lastHeaderClicked = headerClicked;
_lastDirection = direction;
}
}
}
catch (Exception ex)
{
Debug.WriteLine(ex);
}
#endregion } void SetSortStyle(GridViewColumn column, bool isAsc)
{
DataTemplate dataTemplate = null; if (isAsc)
{
dataTemplate = FileViewStyle.GetSortAscStyle(lvFiles);
}
else
{
dataTemplate = FileViewStyle.GetSortDescStyle(lvFiles);
} if (dataTemplate != null)
{
column.HeaderTemplate = dataTemplate;
}
} void Sort(string sortBy, ListSortDirection direction)
{
if (string.IsNullOrEmpty(sortBy)) return; ICollectionView dataView =
CollectionViewSource.GetDefaultView(lvFiles.ItemsSource); dataView.SortDescriptions.Clear();
SortDescription sortByType = new SortDescription("IsFolder", direction);
dataView.SortDescriptions.Add(sortByType);
SortDescription sortByProperty = new SortDescription(sortBy, direction);
dataView.SortDescriptions.Add(sortByProperty);
dataView.Refresh();
}
#endregion
附上其他细节:
public FileManageListView()
{
InitializeComponent();
this.lvFiles.MouseDoubleClick += FilesView_MouseDoubleClick;
lvFiles.KeyDown += LvFiles_KeyDown;
lvFiles.SelectionChanged += LvFiles_SelectionChanged;
} private void LvFiles_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
foreach (var removedItem in e.RemovedItems.Cast<FileItemViewModel>())
{
removedItem.IsSelected = false;
}
foreach (var addedItem in e.AddedItems.Cast<FileItemViewModel>())
{
addedItem.IsSelected = true;
}
FileManagerViewModel.Instance.RaiseCanExecuteChanged();
}
private void Grid_DragOver(object sender, DragEventArgs e)
{
try
{
var itemViewModel = (sender as Grid).DataContext as FileItemViewModel;
FileManagerViewModel.Instance.DragOverItem = itemViewModel;
}
catch (Exception ex)
{
Debug.WriteLine(ex);
}
} private void LvFiles_KeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Delete)
{
var deleteCommand = FileManagerViewModel.Instance.DeleteCommand as ICommand;
if (deleteCommand.CanExecute(null))
{
deleteCommand.Execute(null);
} }
} private void ListViewItem_RequestBringIntoView(object sender, RequestBringIntoViewEventArgs e)
{
e.Handled = true;
}
WPF ListView 使用GridView 带有Header 以及点击header排序 sort的更多相关文章
- WPF ListView 选中问题
WPF ListView 选中问题 摘自:http://www.cnblogs.com/BBHor/archive/2013/04/28/VisualTreeHelper-PreviewMouseD ...
- [WPF]ListView点击列头排序功能实现
[转] [WPF]ListView点击列头排序功能实现 这是一个非常常见的功能,要求也很简单,在Column Header上显示一个小三角表示表示现在是在哪个Header上的正序还是倒序就可以了. ...
- WPF ListView点击删除某一行并获取绑定数据
最近在开发WPF程序时遇到一个问题,在gridview中希望实现在每一行最后添加一个删除的按钮,但是发现点击每行的button时只会触发button的点击事件,并没有选中这一行,此时调用list.Se ...
- WP8.1学习系列(第二十七章)——ListView和GridView入门
快速入门:添加 ListView 和 GridView 控件 (XAML) 在本文中 先决条件 选择 ListView 或 GridView 将项添加到项集合 设置项目源 指定项目的外观 指定视图 ...
- WPF ListView 居中显示
原文:WPF ListView 居中显示 今天遇到的问题: 方法1:设置GridViewColumn的ActualWidth <ListView > <ListView.View&g ...
- WPF listview item mouse enter/over popup
This is because the routing strategy of the Loaded event is Direct, which means that the routed even ...
- wpf listview
<Window x:Class="WpfTutorialSamples.ListView_control.ListViewGridViewSample" xml ...
- WPF:ListView 分组合并
CollectionViewSource 绑定的是从数据库取出的数据ListBind 以DeptName为分组依据 <Window.Resources> <CollectionVie ...
- WPF:ListView 分页
布局MainWindow.xaml <ListView Name="list_Reg" ItemsSource="{Binding Source={StaticRe ...
随机推荐
- HttpContext rewritePath后中文乱码
文章为转载 由于种种原因,最近将服务器上部署的网站修改4.0框架.但悲剧的问题出现了,发现搜索中文的时候关键词都成乱码了. 在网上查找相关资料得到几种相关解决方案如下: 服务器打补丁server200 ...
- POJ 1062
#include<iostream> #include<stdio.h> #define MAXN 105 #define inf 10000000 using namespa ...
- Oracle 数据库维护管理之--dbms_lock
1.查询相关的v$视图,但是提示表或视图不存在解决办法 原因是使用的用户没有相关的查询权限导致 解决办法: grant select any dictionary to 用户; --这 ...
- 导出数据库数据成txt格式
set verify off; set colsep ‘分隔符’; set echo off; set feedback off; set heading off; set pagesize 0; s ...
- 【Canal源码分析】Canal Server的启动和停止过程
本文主要解析下canal server的启动过程,希望能有所收获. 一.序列图 1.1 启动 1.2 停止 二.源码分析 整个server启动的过程比较复杂,看图难以理解,需要辅以文字说明. 首先程序 ...
- 搭建互联网架构学习--004--centos安装Mysql
Mysql安装 1. yum安装mysql yum -y install mysql-server 2. 启动mysql服务 启动mysql:service mysqld start 查看mysql的 ...
- spring boot中使用JdbcTemplate
本文将介绍如何将spring boot 与 JdbcTemplate一起工作.Spring对数据库的操作在jdbc上面做了深层次的封装,使用spring的注入功能,可以把DataSource注册到Jd ...
- hibernate的配置文件,使用XML方式
<?xml version="1.0" encoding="UTF-8"?> <!-- 标准的XML文件的起始行,version='1.0'表 ...
- 最全面的 Android 编码规范指南
最全面的 Android 编码规范指南 本文word文档下载地址:http://pan.baidu.com/s/1bXT75O 1. 前言 这份文档参考了 Google Java 编程风格规范和 Go ...
- Java SPI机制和使用示例
JAVA SPI 简介 SPI 是 Java 提供的一种服务加载方式,全名为 Service Provider Interface.根据 Java 的 SPI 规范,我们可以定义一个服务接口,具体的实 ...