3

私はDataGridいくつかの列を持つWPFで作業して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 をテストし、null 許容型の CanUserSort を false に設定します。

null 許容プリミティブの自動生成された列で標準の並べ替えを有効にするには、次のようにします。

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

これは、(少なくとも) nullable プリミティブ型に対して機能します。

于 2013-10-13T22:15:09.170 に答える