翼度科技»论坛 编程开发 .net 查看内容

WPF随笔收录-DataGrid固定右侧列

6

主题

6

帖子

18

积分

新手上路

Rank: 1

积分
18
一、前言

在项目开发过程中,DataGrid是经常使用到的一个数据展示控件,而通常表格的最后一列是作为操作列存在,比如会有编辑、删除等功能按钮。但WPF的原始DataGrid中,默认只支持固定左侧列,这跟大家习惯性操作列放最后不符,今天就来介绍一种简单的方式实现固定右侧列。(这里的实现方式参考的大佬的两个DataGrid合并在一起的方式,原博客:https://www.cnblogs.com/akwkevin/p/17872348.html
二、正文

1、上面大佬的实现,就直接基于他自己的控件库里实现的,这里我介绍的方式是如何引用了别的第三方库的情况下,在项目代码中再实现自定义可以固定右侧列的DataGrid控件;
2、首先新建个项目,项目里引用了HandyControl控件库和微软的mvvm库。

 3、给项目添加一个自定义控件,记得不是自定义用户控件,这里命名为MyDataGrid,然后就可以从上面大佬那里搬代码过来,关键就是添加RightFrozenCount这个依赖属性代码和两个DataGrid之间的滚动同步代码
  1. public int RightFrozenCount
  2. {
  3.     get { return (int)GetValue(RightFrozenCountProperty); }
  4.     set { SetValue(RightFrozenCountProperty, value); }
  5. }
  6. public static readonly DependencyProperty RightFrozenCountProperty =
  7.     DependencyProperty.Register(nameof(RightFrozenCount), typeof(int), typeof(MyDataGrid),
  8.         new PropertyMetadata(0, OnRightFrozenCountChanged));
  9. private static void OnRightFrozenCountChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
  10. {
  11.     if (d is MyDataGrid dataGridRightFrozen)
  12.     {
  13.         dataGridRightFrozen.OnRightFrozenCountChanged();
  14.     }
  15. }
  16. private void OnRightFrozenCountChanged()
  17. {
  18.     if (_rightDataGrid != null)
  19.     {
  20.         if (RightFrozenCount > 0)
  21.         {
  22.             for (int i = 0; i < _rightDataGrid.Columns.Count; i++)
  23.             {
  24.                 var column = _rightDataGrid.Columns[i];
  25.                 _rightDataGrid.Columns.Remove(column);
  26.                 Columns.Add(column);
  27.             }
  28.             for (int i = 0; i < RightFrozenCount; i++)
  29.             {
  30.                 var last = Columns[^1];
  31.                 Columns.Remove(last);
  32.                 _rightDataGrid.Columns.Insert(0, last);
  33.             }
  34.             _rightDataGrid.SetCurrentValue(VisibilityProperty, Visibility.Visible);
  35.         }
  36.         else
  37.         {
  38.             _rightDataGrid.SetCurrentValue(VisibilityProperty, Visibility.Collapsed);
  39.         }
  40.     }
  41. }
复制代码
  1. public override void OnApplyTemplate()
  2. {
  3.     base.OnApplyTemplate();
  4.     if (_scrollViewer != null)
  5.     {
  6.         _scrollViewer.ScrollChanged -= ScrollViewer_ScrollChanged;
  7.     }
  8.     if (_rightScrollViewer != null)
  9.     {
  10.         _rightScrollViewer.ScrollChanged -= RightScrollViewer_ScrollChanged;
  11.     }
  12.     if (_rightDataGrid != null)
  13.     {
  14.         _rightDataGrid.ScrollViewerChanged -= ScrollViewerChanged;
  15.         _rightDataGrid.SelectionChanged -= RightDataGrid_SelectionChanged;
  16.     }
  17.     _scrollViewer = GetTemplateChild(DG_ScrollViewer) as ScrollViewer;
  18.     if (_scrollViewer != null)
  19.     {
  20.         _scrollViewer.ScrollChanged += ScrollViewer_ScrollChanged;
  21.     }
  22.     _rightDataGrid = GetTemplateChild(PART_Right) as DataGridScrollView;
  23.     if (_rightDataGrid != null)
  24.     {
  25.         _rightDataGrid.ScrollViewerChanged += ScrollViewerChanged;
  26.         _rightDataGrid.SelectionChanged += RightDataGrid_SelectionChanged;
  27.     }
  28.     SelectionChanged += DataGridRightFrozen_SelectionChanged;
  29. }
  30. private void ScrollViewerChanged(ScrollViewer viewer)
  31. {
  32.     _rightScrollViewer = viewer;
  33.     _rightScrollViewer.ScrollChanged += RightScrollViewer_ScrollChanged;
  34. }
  35. private void ScrollViewer_ScrollChanged(object sender, ScrollChangedEventArgs e)
  36. {
  37.     _rightScrollViewer?.ScrollToVerticalOffset(_scrollViewer.VerticalOffset);
  38. }
  39. private void RightScrollViewer_ScrollChanged(object sender, ScrollChangedEventArgs e)
  40. {
  41.     _scrollViewer?.ScrollToVerticalOffset(_rightScrollViewer.VerticalOffset);
  42. }
  43. private void RightDataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
  44. {
  45.     SetCurrentValue(SelectedItemProperty, _rightDataGrid.SelectedItem);
  46. }
  47. private void DataGridRightFrozen_SelectionChanged(object sender, SelectionChangedEventArgs e)
  48. {
  49.     _rightDataGrid.SetCurrentValue(SelectedItemProperty, SelectedItem);
  50. }
复制代码
4、接着去到HandyControl的开源库那里,找到DataGrid的样式,然后复制到项目中

 5、然后对原来的Style进行修改,对ControlTemplate的布局添加上作为固定列的DataGrid


 6、至此,自定义支持右侧列固定的DataGrid就完成了,效果如下:

7、代码地址:https://gitee.com/liulang_g/data-grid-demo
 
来源:https://www.cnblogs.com/liulangg/p/18140748
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具