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 ...
随机推荐
- 个人永久性免费-Excel催化剂功能第41波-文件文件夹相关函数
对于日常办公过程中,每天面对的操作离不开文件.文件夹的操作,当然可以用资源管理器.Everything之类的管理软件来管理.但涉及到批量操作时,在Excel环境或许是个更好的方式,前面很多的内容中不断 ...
- C#3.0新增功能02 匿名类型
连载目录 [已更新最新开发文章,点击查看详细] 匿名类型提供了一种方便的方法,可用来将一组只读属性封装到单个对象中,而无需首先显式定义一个类型. 类型名由编译器生成,并且不能在源代码级使用. 每 ...
- 聊聊HTML5中的Web Notification桌面通知
有的时候我们会在桌面右下角看到这样的提示: 这种桌面提示是HTML5新增的 Web Push Notifications 技术. Web Notifications 技术使页面可以发出通知,通知将被显 ...
- Redis项目实战---应用及理论(上)---redis基础知识介绍
redis(Remote Dictionary Server) 一.原理及特性层面: 1.优势: 1)数据加载在内存中,执行速度快, 数据结构类似于HashMap,HashM ...
- 没事别想不开做Halcon视觉工程师 halcon机器视觉如何学习?
今天我们来听听看来自一个机器视觉工程师的唠叨和吐槽,在这之后,你还想学人工智能,还想学机器视觉?恭喜你,你对人工智能机器视觉是真爱了! 既然自己选择了这条路,那么无论前进路上有多坎坷,跪着也要走完. ...
- 执行shell脚本的四种方式
这篇文章主要介绍了Linux中执行shell脚本的4种方法,即总结在Linux中运行shell脚本的4种方法. 前提:bash shell 脚本的方法有多种,假设我们编写好的shell脚本的文件名为h ...
- 关于STM32F103+ESP8266+阿里云过程之设备状态更新至阿里云(三)
设备与阿里云完成发布订阅的功能,接下来就是将设备状态如温湿度,PM2.5值上报更新至阿里云. 1.查看Topic. 在阿里云平台上 设备->Topic列表中查看.在产品中也可以看到对应的Topi ...
- Github上fork的项目如何merge原Git项目
问题场景 小明在Github上fork了一个大佬的项目,并clone到本地开发一段时间,再提交merge request到原Git项目,过了段时间,原作者联系小明,扔给他下面这幅截图并告知合并处理冲突 ...
- strus 上传文件
(1) action代码 package comSys.struts.articleManager; import java.io.File; import java.io.FileInputStre ...
- 用JavaScript带你体验V8引擎解析标识符过程
上一篇讲了字符串的解析过程,这一篇来讲讲标识符(IDENTIFIER)的解析. 先上知识点,标识符的扫描分为快解析和慢解析,一旦出现Ascii值大于128的字符或者转义字符,会进入慢解析,略微影响性能 ...