3

我正在使用DataGridWPF 中的多个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 本身:

<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));

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

4

2 回答 2

9

DataGridColumn.CreateDefaultColumn(ItemPropertyInfo) 测试 IComparable 的 PropertyType 并将 CanUserSort 设置为 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;
        }
    }
}

这(至少)适用于可为空的原始类型。

于 2013-10-13T22:15:09.170 回答
3

您可以使用可为空属性对 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>

为什么AutoGenerateColumnsnullalble 属性有问题?

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

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

测试:VS2012 .NET 4.5

于 2013-10-09T16:42:11.377 回答