Introduction
It's quite common to bind a WPF DataGrid to data using autogenerated columns. It's equally common to have bound properties of a nullable type (ie Nullable<int>
) . However DataGrid does not provide the standard sorting behaviour for nullable types, the column header is not highlighted and clicking has no action.
Background
The culprit is the DataGridColumn.CreateDefaultColumn(ItemPropertyInfo)
method: It tests the bound property type for IComparable
, int
inherits from IComparable
, but not int?
and therefore DataGridColumn
.CanUserSort
is set to false.
Using the code
The remedy is simple, attach this handler to the DataGrid
.AutoGeneratingColum
n
event:
void DataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
if (!e.Column.CanUserSort)
{
Type type = e.PropertyType;
if (type.IsGenericType && type.IsValueType && typeof(IComparable).IsAssignableFrom(type.GetGenericArguments()[0]))
{
Debug.Assert(type.Name == "Nullable`1");
e.Column.CanUserSort = true;
}
}
}