2013-10-09 75 views
2

我正在使用WPF中的DataGrid與幾個decimal列。我最近將綁定屬性更改爲decimal?,現在這些列無法通過單擊標題進行排序(如同其他列一樣)。但是,我仍然可以使用我的代碼隱藏方法對它們進行排序。是否有人知道是否可以通過單擊標題對decimal?列進行排序,或者如果不可能,背後的原因是什麼?這裏是我的相關代碼:對十進制類型的列進行排序? (可爲空)在WPF 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)); 

不幸的是,我沒有其他補充。如果有人能幫我解決這個問題,我將不勝感激。

回答

3

您可以使用空屬性對DataGrid進行排序,但您需要自行定義所有列。所以它應該是這樣的:

<DataGrid Name="poolDataGrid" AutoGenerateColumns="False" > 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="Coulumn1" Binding="{Binding ProjectedPointsAvg }"/> 
     <DataGridTextColumn Header="Coulumn2" Binding="{Binding ProjectedPointsHi }" /> 
     <DataGridTextColumn Header="Coulumn3" Binding="{Binding ProjectedPointsLo}" /> 
    </DataGrid.Columns> 
</DataGrid> 

爲什麼AutoGenerateColumns存在問題可以爲空的屬性?

看來只有爲類型爲可綁定類型的屬性自動生成列。

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

測試於:VS2012 .NET 4.5

+0

感謝您的回覆。經過一番思考,我決定採取不同的路線,避免使用空值。不幸的是,自動生成的列有這個問題,但總是有解決方法。無論哪種方式,你的回答給了我需要的信息,所以我一定會接受它。 –

6

DataGridColumn.CreateDefaultColumn(ItemPropertyInfo)測試屬性類型爲IComparable的 並設置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; 
     } 
    } 
} 

這工作(至少)爲空的原始類型。