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

这篇具有很好参考价值的文章主要介绍了WPF随笔收录-DataGrid固定右侧列。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、前言

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

二、正文

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

2、首先新建个项目,项目里引用了HandyControl控件库和微软的mvvm库。

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

 3、给项目添加一个自定义控件,记得不是自定义用户控件,这里命名为MyDataGrid,然后就可以从上面大佬那里搬代码过来,关键就是添加RightFrozenCount这个依赖属性代码和两个DataGrid之间的滚动同步代码

public int RightFrozenCount
{
    get { return (int)GetValue(RightFrozenCountProperty); }
    set { SetValue(RightFrozenCountProperty, value); }
}

public static readonly DependencyProperty RightFrozenCountProperty =
    DependencyProperty.Register(nameof(RightFrozenCount), typeof(int), typeof(MyDataGrid),
        new PropertyMetadata(0, OnRightFrozenCountChanged));

private static void OnRightFrozenCountChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    if (d is MyDataGrid dataGridRightFrozen)
    {
        dataGridRightFrozen.OnRightFrozenCountChanged();
    }
}

private void OnRightFrozenCountChanged()
{
    if (_rightDataGrid != null)
    {
        if (RightFrozenCount > 0)
        {
            for (int i = 0; i < _rightDataGrid.Columns.Count; i++)
            {
                var column = _rightDataGrid.Columns[i];
                _rightDataGrid.Columns.Remove(column);
                Columns.Add(column);
            }
            for (int i = 0; i < RightFrozenCount; i++)
            {
                var last = Columns[^1];
                Columns.Remove(last);

                _rightDataGrid.Columns.Insert(0, last);
            }
            _rightDataGrid.SetCurrentValue(VisibilityProperty, Visibility.Visible);
        }
        else
        {
            _rightDataGrid.SetCurrentValue(VisibilityProperty, Visibility.Collapsed);
        }
    }
}
public override void OnApplyTemplate()
{
    base.OnApplyTemplate();
    if (_scrollViewer != null)
    {
        _scrollViewer.ScrollChanged -= ScrollViewer_ScrollChanged;
    }
    if (_rightScrollViewer != null)
    {
        _rightScrollViewer.ScrollChanged -= RightScrollViewer_ScrollChanged;
    }
    if (_rightDataGrid != null)
    {
        _rightDataGrid.ScrollViewerChanged -= ScrollViewerChanged;
        _rightDataGrid.SelectionChanged -= RightDataGrid_SelectionChanged;
    }

    _scrollViewer = GetTemplateChild(DG_ScrollViewer) as ScrollViewer;
    if (_scrollViewer != null)
    {
        _scrollViewer.ScrollChanged += ScrollViewer_ScrollChanged;
    }

    _rightDataGrid = GetTemplateChild(PART_Right) as DataGridScrollView;
    if (_rightDataGrid != null)
    {
        _rightDataGrid.ScrollViewerChanged += ScrollViewerChanged;
        _rightDataGrid.SelectionChanged += RightDataGrid_SelectionChanged;
    }
    SelectionChanged += DataGridRightFrozen_SelectionChanged;
}

private void ScrollViewerChanged(ScrollViewer viewer)
{
    _rightScrollViewer = viewer;
    _rightScrollViewer.ScrollChanged += RightScrollViewer_ScrollChanged;
}

private void ScrollViewer_ScrollChanged(object sender, ScrollChangedEventArgs e)
{
    _rightScrollViewer?.ScrollToVerticalOffset(_scrollViewer.VerticalOffset);
}

private void RightScrollViewer_ScrollChanged(object sender, ScrollChangedEventArgs e)
{
    _scrollViewer?.ScrollToVerticalOffset(_rightScrollViewer.VerticalOffset);
}

private void RightDataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    SetCurrentValue(SelectedItemProperty, _rightDataGrid.SelectedItem);
}

private void DataGridRightFrozen_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    _rightDataGrid.SetCurrentValue(SelectedItemProperty, SelectedItem);
}

4、接着去到HandyControl的开源库那里,找到DataGrid的样式,然后复制到项目中

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

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

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

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

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

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

7、代码地址:https://gitee.com/liulang_g/data-grid-demo文章来源地址https://www.toymoban.com/news/detail-854650.html

 

到了这里,关于WPF随笔收录-DataGrid固定右侧列的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 记一次WPF的DataGrid绑定数据

    之前一直在用winform,但是感觉界面不好看,然后就自己在网上学习WPF。一开始看到DataGrid的时候,还以为它是DataGridView,然后用winform的方法绑定数据发现不行,在不断的查找之后,终于学会了怎么简单的绑定数据。 工具:VStudio2022 框架:.net framework 4.8 新建一个 WPF 窗体,再

    2024年03月28日
    浏览(35)
  • CSS实现左侧固定,右侧自适应(5种方法)

    实现效果:

    2024年02月12日
    浏览(25)
  • WPF DataGrid详细列表手动显示与隐藏

    2024年02月07日
    浏览(28)
  • Wpf DataGrid设置列标题动态绑定实例

    在 WPF 中,可以使用 DataGrid 控件来显示和编辑表格式的数据。要设置 DataGrid 列标题的动态绑定,可以使用 DataGrid 的列定义和绑定功能。 以下是一个示例,展示如何使用动态绑定设置 DataGrid 的列标题: 在 XAML 中定义 DataGrid 控件,并为其定义列: 在代码后台(如 ViewModel 或

    2024年02月08日
    浏览(33)
  • 新手入门WPF之DataGrid控件(一)

    DataGrid的使用其实跟TreeView类似,只不过后台组织的对象结构不同,DataGrid一般不需要递归结构,它绑定的数据源,一个属性就代表一个一列,理解不了没事,我直接上代码。 定义了一个关于水果的对象(这次偷懒了,想着简单介绍下,就没按正规创建工程的方式来了)  三个

    2024年02月04日
    浏览(26)
  • WPF-改变Datagrid的选中行的颜色

    用触发器比如:以DataGrid为例:             DataGrid.RowStyle                                 Style TargetType=\\\"DataGridRow\\\"                                     Setter Property=\\\"Background\\\" Value=\\\"White\\\"/                                     Style.Triggers                        

    2024年02月07日
    浏览(31)
  • WPF --- 如何以Binding方式隐藏DataGrid列

    如题,如何以Binding的方式动态隐藏DataGrid列? 像这样: 先在ViewModel创建数据源 People 和控制列隐藏的 IsVisibility ,这里直接以 MainWindow 为 DataContext 然后创建 VisibilityConverter ,将布尔值转化为 Visibility 。 然后再界面绑定 IsVisibility ,且使用转化器转化为 Visibility ,最后增加一个

    2024年02月05日
    浏览(41)
  • WPF入门教程系列三十 ——DataGrid验证

    WPF入门教程系列目录 WPF入门教程系列二——Application介绍 WPF入门教程系列三——Application介绍(续) WPF入门教程系列四——Dispatcher介绍 WPF入门教程系列五——Window 介绍 WPF入门教程系列十一——依赖属性(一) WPF入门教程系列十五——WPF中的数据绑定(一)            DataG

    2024年02月12日
    浏览(26)
  • WPF 自定义DataGrid控件样式模板5个

    样式一: 样式代码: 初始化绑定数据C#代码: 效果展示: 样式二: 上面的代码实现了隔行换色的效果,但是没有鼠标选中效果。另外有些用户希望能够进行列头拖动及排序。那么就需要做以下更改: 添加DataGridRow样式: 在引用时,设置DataGrid的RowStyle=\\\"{StaticResource AlertCoun

    2023年04月27日
    浏览(31)
  • 让WPF中的DataGrid像Excel一样可以筛选

    在默认情况下,WPF提供的DataGrid仅拥有数据展示等简单功能,如果要实现像Excel一样复杂的筛选过滤功能,则相对比较麻烦。本文以一个简单的小例子,简述如何通过WPF实话DataGrid的筛选功能,仅供学习分享使用,如有不足之处,还请指正。 在本示例中,从数据绑定,到数据展

    2024年01月17日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包