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
@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
}