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点击列头选择全列并具有背景色的更多相关文章

  1. [DevExpress]GridControl 同步列头checkbox与列中checkbox状态

    关键代码: /// <summary> /// 同步列头checkbox与列中checkbox状态 /// </summary> /// <param name=&quo ...

  2. SQL面试题:有A B C三列,用SQL语句实现:当A列大于B列时选择A列否则选择B列

    .请教一个面试中遇到的SQL语句的查询问题 表中有A B C三列,用SQL语句实现:当A列大于B列时选择A列否则选择B列,当B列大于C列时选择B列否则选择C列. ------------------- ...

  3. 用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 ...

  4. 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 ...

  5. easyui datagrid 点击列表头排序出现错乱的原因

    之前我的导师,也就是带我的同事,使用datagrid,发现点击列表头排序出现乱序,按理说只有顺序和逆序两种排序结果.因为他比较忙,当时没解决,把排序禁掉了,后来又要求一定要排序,所以他交给我. 一开始 ...

  6. 【转】WPF DataGrid 获取选中的当前行某列值

    方法一:DataRowView mySelectedElement = (DataRowView)dataGrid1.SelectedItem; string result = mySelectedE ...

  7. WPF DataGrid 获取选中的当前行某列值

    方法一: DataRowView mySelectedElement = (DataRowView)dataGrid1.SelectedItem; ]ToString(); 方法二: var a = ...

  8. 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 表 ...

  9. wpf中为DataGrid添加checkbox支持多选全选

    项目中用到DataGrid, 需要在第一列添加checkbox, 可以多选.全选. 其中涉及的概念DataTemplate, DataGridCellStyle, DataGridCellContro ...

随机推荐

  1. ASP.NET Core系列(二):创建第一个.Net Core 项目

    前面讲过 .NET Core简介及开发环境安装,本章会讲一讲ASP.NET Core 2.0的项目结构,查看完整的ASP.NET Core系列文章:https://www.cnblogs.com/zh ...

  2. Excel催化剂开源第34波-SM.MS图床API调用(用POST上传multipart/form-data内容)

    日常做网抓数据,都是以GET请求为主,偶尔遇到需要POST请求的,一般POST的参数只是一串字符串就可以了,通过构造字符串也很容易完成,但此次SM.MS的API接口要求是Content-Type: m ...

  3. 踩坑 Spring Cloud Hystrix 线程池队列配置

    背景: 有一次在生产环境,突然出现了很多笔还款单被挂起,后来排查原因,发现是内部系统调用时出现了Hystrix调用异常.在开发过程中,因为核心线程数设置的比较大,没有出现这种异常.放到了测试环境,偶尔 ...

  4. 【SVN】SVN使用教程总结

    SVN使用教程总结 SVN简介: 为什么要使用SVN? 程序员在编写程序的过程中,每个程序员都会生成很多不同的版本,这就需要程序员有效的管理代码,在需要的时候可以迅速,准确取出相应的版本. Subve ...

  5. php上传excle文件,csv文件解析为二维数组

    解析上传的CSV文件不是什么难事,直接读取转成你想要的数组样子就OK了. public function putStoreStockIn ($filePath = '') { $file = fope ...

  6. PhpCms V9中的{date('Y-m-d',$r[inputtime])}问题解决方法

    不少朋友会碰到这个问题:在PhpCms V9中的首页或者文章内容页调用发布时间{date('Y-m-d',$r[inputtime])}调用显示1970-01-01,然后尝试用截断的方法也没有成功,应 ...

  7. linux初学者-文件管理篇

    linux初学者-文件管理篇 linux系统的所有东西都是以文件的形式存储在计算机中的,所以linux系统中对文件的管理非常重要.以下介绍一些文件管理的常用方法. 1.文件的建立 文件的建立或者修改文 ...

  8. HDU 多校 第三场 Fansblog

    代码千万条,规范第一条 训练赛的时候打表找规律,发现答案是1/(st-pre-1)!,奈何用错了模板,一直TLE到比赛结束,一直以为是卡什么输入输出或者是两个素数相差太大导致复杂度过高,读入优化啥的都 ...

  9. Ubuntu启动Apache

    划重点:最重要的是找到一个文件--------startup.sh 如果你是按照百度上的方法下载的Apache2,那么就按照百度的方式来 但是异曲同工 如果你是自己在网上下载的Apache到的磁盘 找 ...

  10. C# 10分钟完成百度图片提取文字(文字识别)——入门篇

    现在图片文字识别已经很成熟了,比如qq长按图片,点击图片识别就可以识别图片的文字,将不认识的.文字数量大的.或者不能赋值的值进行二次可复制功能. 我们现在就基于百度Ai开放平台进行个人文字识别,dem ...