对十进制类型的列进行排序?(可为空)在 WPF 数据网格中

本文关键字:WPF 数据 网格 数据网 类型 十进制 排序 | 更新日期: 2023-09-27 18:34:32

我正在使用 WPF 中的DataGrid,其中包含多个decimal列。我最近将绑定属性更改为 decimal? s,现在这些列无法通过单击标题进行排序(就像我的其他列一样(。但是,我仍然可以使用代码隐藏中的方法对它们进行排序。有谁知道是否可以通过单击标题对decimal?列进行排序,或者如果不可能,它背后的原因是什么?这是我的相关代码:

有问题的几列(该属性附加到 DataGrid 的行为。启用/禁用行为没有区别(:

[Column("PPAvg", 7)]
public decimal? ProjectedPointsAvg { get; set; }
[Column("PPHi", 8)]
public decimal? ProjectedPointsHi { get; set; }
[Column("PPLo", 9)]
public decimal? ProjectedPointsLo { get; set; }

数据网格本身:

<DataGrid x:Name="poolDataGrid"
          Grid.Row="1"
          CanUserAddRows="False"
          IsReadOnly="True"
          MouseDoubleClick="poolDataGrid_MouseDoubleClick">
    <i:Interaction.Behaviors>
        <local:ColumnHeaderBehavior />
    </i:Interaction.Behaviors>
</DataGrid>

我仍然可以使用如下内容通过代码隐藏进行排序:

var col = poolDataGrid.Columns.SingleOrDefault(c => c is DataGridTextColumn && c.Header.ToString() == "PPHi");
poolDataGrid.Items.SortDescriptions.Add(new SortDescription(col.SortMemberPath, ListSortDirection.Descending));

不幸的是,我没有太多要补充的。如果有人能帮助我解决这个问题,我将不胜感激。

对十进制类型的列进行排序?(可为空)在 WPF 数据网格中

DataGridColumn.CreateDefaultColumn(ItemPropertyInfo( tests PropertyType for IComparable并将可为空的类型设置为 false。

要对可为空的基元的自动生成列启用标准排序,请执行以下操作:

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]))
        {
            // allow nullable primitives to be sorted
            Debug.Assert(type.Name == "Nullable`1");
            e.Column.CanUserSort = true;
        }
    }
}

这(至少(适用于可为空的基元类型。

可以使用可为 null 的属性对 DataGrid 进行排序,但需要自行定义所有列。所以它应该是这样的:

<DataGrid Name="poolDataGrid" AutoGenerateColumns="False" >
   <DataGrid.Columns>
      <DataGridTextColumn Header="Column1"  Binding="{Binding ProjectedPointsAvg }"/>
      <DataGridTextColumn Header="Column2" Binding="{Binding ProjectedPointsHi }" />
      <DataGridTextColumn Header="Column3" Binding="{Binding ProjectedPointsLo}" />
   </DataGrid.Columns>
</DataGrid>

为什么AutoGenerateColumns在可为空的属性方面存在问题?

似乎只有对于类型为可绑定类型的属性,才会自动生成列。

更多: http://vaultofthoughts.net/IsBindableTypeMysteryMethod.aspx

测试于: VS2012 .NET 4.5