WPF 4 DataGrid: Getting the Row Number into the RowHeader

前端 未结 5 1928
日久生厌
日久生厌 2020-12-02 19:02

I am looking to get the row number into the RowHeader of the WPF 4 DataGrid so it has an Excel-like column for the row numbers of the DataGrid.

The solution I\'ve se

5条回答
  •  一整个雨季
    2020-12-02 19:56

    @Fredrik Hedblad's answer works for me. Thanks!

    I added another property to get an "offset" value so the DataGrid can start from either 0 or 1 (or whatever is set).

    To use the behavior, (note 'b' is the namespace)

    
    

    The modified classes:

    /// 
    /// Collection of DataGrid behavior
    /// 
    public static class DataGridBehavior
    {
        #region DisplayRowNumberOffset
    
        /// 
        /// Sets the starting value of the row header if enabled
        /// 
        public static DependencyProperty DisplayRowNumberOffsetProperty =
            DependencyProperty.RegisterAttached("DisplayRowNumberOffset",
                                                typeof(int),
                                                typeof(DataGridBehavior),
                                                new FrameworkPropertyMetadata(0, OnDisplayRowNumberOffsetChanged));
    
        public static int GetDisplayRowNumberOffset(DependencyObject target)
        {
            return (int)target.GetValue(DisplayRowNumberOffsetProperty);
        }
    
        public static void SetDisplayRowNumberOffset(DependencyObject target, int value)
        {
            target.SetValue(DisplayRowNumberOffsetProperty, value);
        }
    
        private static void OnDisplayRowNumberOffsetChanged(DependencyObject target, DependencyPropertyChangedEventArgs e)
        {
            DataGrid dataGrid = target as DataGrid;
            int offset = (int)e.NewValue;
    
            if (GetDisplayRowNumber(target))
            {
                WPFUtil.GetVisualChildCollection(dataGrid).
                        ForEach(d => d.Header = d.GetIndex() + offset);
            }
        }
    
        #endregion
    
        #region DisplayRowNumber
    
        /// 
        /// Enable display of row header automatically
        /// 
        /// 
        /// Source: 
        /// 
        public static DependencyProperty DisplayRowNumberProperty =
            DependencyProperty.RegisterAttached("DisplayRowNumber",
                                                typeof(bool),
                                                typeof(DataGridBehavior),
                                                new FrameworkPropertyMetadata(false, OnDisplayRowNumberChanged));
    
        public static bool GetDisplayRowNumber(DependencyObject target)
        {
            return (bool)target.GetValue(DisplayRowNumberProperty);
        }
    
        public static void SetDisplayRowNumber(DependencyObject target, bool value)
        {
            target.SetValue(DisplayRowNumberProperty, value);
        }
    
        private static void OnDisplayRowNumberChanged(DependencyObject target, DependencyPropertyChangedEventArgs e)
        {
            DataGrid dataGrid = target as DataGrid;
            if ((bool)e.NewValue == true)
            {
                int offset = GetDisplayRowNumberOffset(target);
    
                EventHandler loadedRowHandler = null;
                loadedRowHandler = (object sender, DataGridRowEventArgs ea) =>
                {
                    if (GetDisplayRowNumber(dataGrid) == false)
                    {
                        dataGrid.LoadingRow -= loadedRowHandler;
                        return;
                    }
                    ea.Row.Header = ea.Row.GetIndex() + offset;
                };
                dataGrid.LoadingRow += loadedRowHandler;
    
                ItemsChangedEventHandler itemsChangedHandler = null;
                itemsChangedHandler = (object sender, ItemsChangedEventArgs ea) =>
                {
                    if (GetDisplayRowNumber(dataGrid) == false)
                    {
                        dataGrid.ItemContainerGenerator.ItemsChanged -= itemsChangedHandler;
                        return;
                    }
                    WPFUtil.GetVisualChildCollection(dataGrid).
                        ForEach(d => d.Header = d.GetIndex() + offset);
                };
                dataGrid.ItemContainerGenerator.ItemsChanged += itemsChangedHandler;
            }
        }
    
        #endregion // DisplayRowNumber
    }
    

提交回复
热议问题