对十进制类型的列进行排序?(可为空)在 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));
不幸的是,我没有太多要补充的。如果有人能帮助我解决这个问题,我将不胜感激。
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