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中附加属性的技术。

  • 相关阅读:
    234. Palindrome Linked List(判断链表是否回文)
    141. Linked List Cycle(判断链表是否有环)
    第二届“中国高校计算机大赛-大数据挑战赛” 20名
    Spark集群 Python Package管理
    Android中单选框RadioButton的基本用法
    【Android】进程间通信IPC——Binder
    Spring Boot 集成 JWT 实现单点登录授权
    pythonGUI编程——Qt库(1)
    Android获取SD卡路径/内存的几种方法
    Android主题更换换肤
  • 原文地址:https://www.cnblogs.com/luqingfei/p/12697212.html
Copyright © 2011-2022 走看看