WPF DataGrid点击列头选择全列并具有背景色
2019年10月3日改:
最主要的思路还是通过点击(排序)事件获取当前点击的列的名称或者index,然后赋值一个字段,通过字段来判断。
这个过程可以通过行为来完成,也可以通过附加属性来完成。
选择将数据模型继承于类我觉得大概是最慢的一个方法了。但是比较直观的。
完成这个操作,主要是XAML的代码。
主要思路是通过绑定多路数据,在多路转换器中返回布尔值,在通过数据触发器来设置被选择的全列的背景色。
XAML页面主要代码
首先定义DataGridCell
<Style TargetType="DataGridCell" x:Key="dgc">
<Setter Property="Tag" >
<Setter.Value>
<MultiBinding Converter="{StaticResource T2}">
<Binding Path="DataContext.SelectColumn" RelativeSource="{RelativeSource Mode=FindAncestor,AncestorLevel=1,AncestorType=DataGrid}"/>
<Binding Path="Column.Header" RelativeSource="{RelativeSource Mode=Self}" />
</MultiBinding>
</Setter.Value>
</Setter>
<Style.Triggers>
<DataTrigger Binding="{Binding Tag,RelativeSource={RelativeSource Mode=Self}}" Value="True">
<!--此处的颜色也可以单独列一个-->
<Setter Property="Background" Value="Red"/>
</DataTrigger>
</Style.Triggers>
</Style>
定义转换器并使用
public class ToConverter : IMultiValueConverter
{ public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
var a = values[].ToString();
var b = values[].ToString(); return a == b ? true : false; } public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
xaml代码
<local:ToConverter x:Key="T2" />
<!--如果单独绑定颜色可以这么弄,然后通过静态资源绑定到数据触发器的setter即可-->
<SolidColorBrush Color="Red" x:Key="color"/>
定义DataGrid并创建排序事件和使用CellStyle如下
<DataGrid Sorting="Dg_Sorting" ItemsSource="{Binding List}" CellStyle="{StaticResource dgc}" x:Name="dg" />
定义数据模型并赋值给DataGrid如下
public class T1
{
public string Name { get; set; }
public int ID { get; set; } }
public class T2:INotifyPropertyChanged
{
public ObservableCollection<T1> List { get; set; }
private string select;
public string SelectColumn { get=>select; set { select = value;onchanged(new PropertyChangedEventArgs("SelectColumn")); } }
protected void onchanged(PropertyChangedEventArgs args) => PropertyChanged?.Invoke(this, args);
public event PropertyChangedEventHandler PropertyChanged;
}
创建并赋值
ObservableCollection<T1> t = new ObservableCollection<T1>();
T2 datalist;
public MainWindow()
{
InitializeComponent(); for (var i = ; i < ; i++)
t.Add(new T1() { ID = i, Name = "i: " + i.ToString() });
datalist = new T2();
datalist.List = t;
datalist.SelectColumn = string.Empty;
dg.DataContext = datalist;
}
最后编写排序事件中的代码如下
private void Dg_Sorting(object sender, DataGridSortingEventArgs e)
{
datalist.SelectColumn = e.Column.Header.ToString();
e.Handled = true;
}
运行截图
如果是想将选定好的单元格添加到DataGrid的SelectCells中
则是需要添加玖彩技术团队的这篇文章中的扩展类
然后关闭DataGrid的虚拟化
VirtualizingPanel.IsVirtualizing="False"
最后在排序事件中编写代码如下
private void Dg_Sorting(object sender, DataGridSortingEventArgs e)
{ datalist.SelectColumn = e.Column.Header.ToString();
for (var i = ; i < datalist.List.Count; i++)
dg.SelectedCells.Add(new DataGridCellInfo(dg.GetCell(i, e.Column.DisplayIndex)));
e.Handled = true;
}
****************
迫不得已 我是非常不建议这么操作的。
我建议使用数据绑定,操作数据来改变UI/数据的方式。
一是通过修改绑定数据这样子就可以避免关闭DataGrid的虚拟化
二是操作相对简单,仅仅操作数据即可
WPF DataGrid点击列头选择全列并具有背景色的更多相关文章
- [DevExpress]GridControl 同步列头checkbox与列中checkbox状态
关键代码: /// <summary> /// 同步列头checkbox与列中checkbox状态 /// </summary> /// <param name=&quo ...
- SQL面试题:有A B C三列,用SQL语句实现:当A列大于B列时选择A列否则选择B列
.请教一个面试中遇到的SQL语句的查询问题 表中有A B C三列,用SQL语句实现:当A列大于B列时选择A列否则选择B列,当B列大于C列时选择B列否则选择C列. ------------------- ...
- 用SQL语句实现:当A列大于B列时选择A列否则选择B列,当B列大于C列时选择B列否则选择C列。
数据库中有A B C三列,用SQL语句实现:当A列大于B列时选择A列否则选择B列,当B列大于C列时选择B列否则选择C列. 方法一: select (case when a>b then a el ...
- SQL语句实现:当A列大于B列时选择A列否则选择B列,当B列大于C列时选择B列否则选择C列
分享一道今天的面试题:SQL语句实现:数据库中有A B C三列,当A列大于B列时选择A列否则选择B列,当B列大于C列时选择B列否则选择C列 第一种:使用case when...then...else ...
- easyui datagrid 点击列表头排序出现错乱的原因
之前我的导师,也就是带我的同事,使用datagrid,发现点击列表头排序出现乱序,按理说只有顺序和逆序两种排序结果.因为他比较忙,当时没解决,把排序禁掉了,后来又要求一定要排序,所以他交给我. 一开始 ...
- 【转】WPF DataGrid 获取选中的当前行某列值
方法一:DataRowView mySelectedElement = (DataRowView)dataGrid1.SelectedItem; string result = mySelectedE ...
- WPF DataGrid 获取选中的当前行某列值
方法一: DataRowView mySelectedElement = (DataRowView)dataGrid1.SelectedItem; ]ToString(); 方法二: var a = ...
- SQL面试题: 数据库中有A B C三列,用SQL语句实现:当A列大于B列时选择A列否则选择B列 ,当B列大于C列时选择B列否则选择C列 ,
1.用一条sql语句 select (case when a>b then a else b end ),(case when b>c then b esle c end) from 表 ...
- wpf中为DataGrid添加checkbox支持多选全选
项目中用到DataGrid, 需要在第一列添加checkbox, 可以多选.全选. 其中涉及的概念DataTemplate, DataGridCellStyle, DataGridCellContro ...
随机推荐
- 深入理解Java虚拟机一 阅读笔记
xl_echo编辑整理.欢迎添加echo微信(微信号:t2421499075)交流学习. 百战不败,依不自称常胜,百败不颓,依能奋力前行.--这才是真正的堪称强大!! --- > 以下内容摘抄自 ...
- Neo4j配置文件neo4j.conf
机器配置为256G内存,48核(物理核24)cpu,4T SAS盘(建议磁盘使用SSD) 图数据库Neo4j配置文件neo4j.conf 中常用参数: dbms.active_database=gra ...
- py+selenium遇见IE,元素只有name属性【神奇解决】
问题:当需要自动化测试某系统,而该系统只兼容IE8,怎么办? IE8的问题:IE8不支持getElementByName,而属性中又没有ID,定位难度较大. IE8以下不兼容getElementByN ...
- Cocos2d-x 3.x 学习笔记(三):Scheduler Timer 调度与定时
1. 概述 Cocos2d-x 的 Scheduler 离不开 Timer.Timer 类是定时器,用来规定一个回调函数应该在何时被触发.Timer 封装了已运行时间.重复次数.已执行次数.延迟秒数 ...
- 小白开学Asp.Net Core《二》
小白开学Asp.Net Core<二> ——数据仓储层(Repositroy) 一.历史现象 在后端开发中,数据库操作是最频繁的,每一个开发人员都会接触,甚至不少开发人员每天的工作就是与数 ...
- 脑裂是什么?Zookeeper是如何解决的?
什么是脑裂 脑裂(split-brain)就是"大脑分裂",也就是本来一个"大脑"被拆分了两个或多个"大脑",我们都知道,如果一个人有多个大 ...
- datatables editor fields type
其实editor fields type 默认支持的输入类型就是w3c输入框类型. text number password textarea select checkbox ...
- javascript基本特点,组成和应用
JavaScript 是一种基于客户端浏览器.面向(基于)对象和事件驱动式的网页脚本语言. 1. 基于客户端浏览器:静态语言,跨平台: 2. 面向(基于)对象:本身是没有类class和对象这个概念,但 ...
- 洛谷 P3387 题解
题面 裸跑一遍SPFA,统计每个点的入队次数: 如果该点的入队次数>=总点数,那么该点便是一个负环上的点: 重点!!!: 1.不是“YES”,是“YE5”: 2.不是“NO”,是“N0”:(是零 ...
- Android 9.0 关机流程分析
极力推荐文章:欢迎收藏 Android 干货分享 阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android 本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以 ...