zoukankan      html  css  js  c++  java
  • WPF里借助附加属性让DataGrid显示行号

    大部分表格,都有显示行号的需求。

    WPF里的DataGrid显示行号,一般如下方式显示:

     在后台代码里写上相应的事件处理方法:

     

    运行效果如下:

     但是,这样需要对项目里的所有需要显示行号的DataGrid都要写重复的代码。

    十分不优雅。

    下面介绍一种通过附加属性的方式,把上面的代码进行一下封装。

    然后每次应用的时候,只需要简单的给DataGrid设置一下属性即可。

    #region DisplayRowNumber
            public static bool GetDisplayRowNumber(DependencyObject obj)
            {
                return (bool)obj.GetValue(DisplayRowNumberProperty);
            }
    
            [AttachedPropertyBrowsableForType(typeof(DataGrid))]
            public static void SetDisplayRowNumber(DependencyObject obj, bool value)
            {
                obj.SetValue(DisplayRowNumberProperty, value);
            }
    
            /// <summary>
            /// 设置是否显示行号
            /// </summary>
            public static readonly DependencyProperty DisplayRowNumberProperty =
                DependencyProperty.RegisterAttached("DisplayRowNumber", 
                                                    typeof(bool), 
                                                    typeof(DataGridHelper), 
                                                    new PropertyMetadata(false, OnDisplayRowNumberChanged));
    
            private static void OnDisplayRowNumberChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
            {
                DataGrid grid = d as DataGrid;
                if (grid == null)
                {
                    return;
                }
    
                if ((bool)e.NewValue)
                {
                    grid.LoadingRow += OnGridLoadingRow;
                    grid.UnloadingRow += OnGridUnloadingRow;
                }
                else
                {
                    grid.LoadingRow -= OnGridLoadingRow;
                    grid.UnloadingRow -= OnGridUnloadingRow;
                }
            }
    
            private static void RefreshDataGridRowNumber(object sender)
            {
                DataGrid grid = sender as DataGrid;
                if (grid == null)
                {
                    return;
                }
    
                foreach (var item in grid.Items)
                {
                    var row = (DataGridRow)grid.ItemContainerGenerator.ContainerFromItem(item);
                    if (row == null)
                    {
                        return;
                    }
                    row.Header = row.GetIndex() + 1;
                }
            }
    
            private static void OnGridUnloadingRow(object sender, DataGridRowEventArgs e)
            {
                RefreshDataGridRowNumber(sender);
            }
    
            private static void OnGridLoadingRow(object sender, DataGridRowEventArgs e)
            {
                RefreshDataGridRowNumber(sender);
            }
    
            #endregion
    

      

    总结,主要运用了WPF中附加属性的技术。

  • 相关阅读:
    MySQL多实例的环境下,服务器端本地连接到指定实例的问题(sock方式连接)
    binlog2sql实现MySQL误操作的恢复
    MySQL 8.0 新增SQL语法对窗口函数和CTE的支持
    asp.net msbuild 发布
    vue aes
    c# Mono.Cecil IL方式 读MethodBody
    C# IL 生成EXE
    js 动态加载 jq
    mysql 得到指定时间段的日期
    powershell 开windows 端口
  • 原文地址:https://www.cnblogs.com/luqingfei/p/12697212.html
Copyright © 2011-2022 走看看