2013-04-10 59 views
3

我試圖讓我的專欄使用DataGrid SortMemberPath="COLUMN"屬性進行排序,我得到一個奇怪的排列順序如下所示:WPF數據網格類型的錯誤

enter image description here

它看起來像列的排序數字的第一位數字的基礎,而不是整個數字。我怎樣才能解決這個問題?

編輯:

好的,我看到了什麼問題。我現在使用這個轉換器,但仍然沒有改變。

public class IntToStringConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (value is string) 
     { 
      string s = (string)value; 
      int num; 
      if (int.TryParse(s, out num)) 
       return Int32.Parse(s); 
     } 
     return DependencyProperty.UnsetValue; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 

     int number = (int)value; 
     return number.ToString(); 
    } 
} 

我將此添加到我的XAML文件Windows.Resource:

<me:IntToStringConverter x:Key="IntToStringConverter"/> 

,並改變了我的數據部分這一變化:

<toolkit:DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <TextBlock Text="{Binding MinRun, Converter={StaticResource IntToStringConverter}}" HorizontalAlignment="Center" /> 
         </DataTemplate> 
        </toolkit:DataGridTemplateColumn.CellTemplate> 

這裏是XAML的DataGrid的一部分。請注意,在所有列中,我首先嚐試讓'MinRun'列正確排序,然後在其他列上使用相同的技術。

http://pastebin.com/ec14p4ks

回答

2

看起來它正在做一個字符串排序,這向我建議你將該列綁定到一個String屬性。將該屬性更改爲整數類型,並且DataGrid將正確排序。

根據我的經驗,程序員將該屬性設置爲字符串類型,因爲他們希望在值無效時顯示空字符串。相反,使用ValueConverter可以在WPF對基礎數據進行數字排序時靈活地顯示所需的任何字符串。

+0

我將如何進行綁定?我對WPF有點新意,對不起。 –

+0

就像現在這樣做。有幾種方法可以做到這一點。由於您在DataGrid中看到了數據,因此請堅持您正在做的事情。只需更改數據類型。 – Philip

2

你列可能是綁定到String對象。 因此,排序做字母作業,而不是數字。

您應該將您的列綁定到int值。

+0

好的,我明白了。我現在使用這個轉換器,但我仍然沒有看到任何改變。 –

+0

你檢查過你的轉換器是否工作?當你的DataGrid被填充時,你能檢查你的列中是否有整數? –

+0

我開始在'return num'行放置一個斷點並在visual studio中進行調試,看它是否從它讀入的字符串返回int,並且它正在工作。我檢查了變量的值,果然,輸入值爲「6」,返回的num值爲6. 當我單擊列的標題以在調試模式下排序時,我再次爲每個值。然而,這種說法並不正確。 –

-2

幸運的是,我可以改變原來的課程,但我對答案感興趣。

我添加了只讀整數屬性。

+1

這似乎不是一個答案。 –

0

鑑於

數據網格表示TestResults其中經過的時間轉化爲串中的模型的集合。綁定到DataGrid時,按字符串排序而不是數值。如下所示

解決方案:var qry是一個定製型的ListDouble類型的屬性TestElapsedTime

到DataGrid中

<DataGrid x:Name="testResultsDataGrid" Sorting="OnSorting"> 

添加排序事件處理程序的事件處理程序

private void OnSorting(object sender, DataGridSortingEventArgs e) 
    { 
     var col = e.Column.Header.ToString(); 
     if (col == "Elapsed Time") 
     { 
      var qry = GetCollectionViewSourceDefaultView(); 
      qry.Sort((x, y) => 
      { 
       var diff = x.TestElapsedTime - y.TestElapsedTime; 
       return (int)diff; 
      }); 
     } 
    } 

問題

經過時間是雙重所以拉姆達不得不執行一個強制轉換爲int所示。

驚喜

排序由顯示DataGrid中確定的方向,它知道如何使用一個排序功能兩個方向進行排序!