2017-05-26 60 views
0

我想排序列表綁定到WPF數據網格的清單<>。在第一次加載時,它是完全未排序的,但是當您單擊標題時,它應該在升序和降序之間切換。奇怪的是,列表<>排序,當我重新綁定列表<>到Itemssource,並刷新等...它仍然顯示升序。但是當我設置一個斷點並查看ItemsSource中的內容時,這些項目會被排序?!它不會出於任何原因顯示在數據網格中。任何想法如何發生?排序後不工作的WPF數據網格刷新

的DataGrid的SortingEvent(LibraryView)

private void LibraryView_Sorting(object sender, DataGridSortingEventArgs e) 
     { 
      var sortDirection = e.Column.SortDirection; 
      switch (sortDirection) 
      { 
       default: 
       case ListSortDirection.Descending: //not needed, but makes things clearer 
        sortDirection = ListSortDirection.Ascending; 
        break; 
       case ListSortDirection.Ascending: 
        sortDirection = ListSortDirection.Descending; 
        break; 
      } 

      _manager.SortLibrary(e.Column.SortMemberPath, sortDirection); 
      //LibraryView.Items.Clear(); //tried this 
      LibraryView.ItemsSource = null; //tried this 
      LoadLibrary(); 
      LibraryView.Items.Refresh(); //tried this 
     } 

調用LoadLibrary:

private void LoadLibrary() 
{ 
    if (_manager.CheckLibrary()) 
    { 
     LibraryView.ItemsSource = _manager.GetLibrarySongs(); 
    } 
} 

排序本身:

public void SortLibrary(string member, ListSortDirection? sortDirection) 
    { 
    PropertyDescriptor prop = TypeDescriptor.GetProperties(typeof(Song)).Find(member, true); 

    switch (sortDirection) 
    { 
     default: 
     case ListSortDirection.Descending: //not needed, but makes things clearer 
     _library.Songs = _library.Songs.OrderByDescending(s => prop.GetValue(s)).ToList(); 
     Debug.WriteLine("Sorting descending!!!!"); 
     break; 
     case ListSortDirection.Ascending: 
     _library.Songs = _library.Songs.OrderBy(s => prop.GetValue(s)).ToList(); 
     Debug.WriteLine("Sorting ascencding!!!!"); 
     break; 
    } 
    } 

我知道有噸對這個話題,但一切我來了橫跨,仍然不能解決這個問題。 我對WPF沒有太多的經驗,所以如果我做錯了什麼,或者做得不好,請告訴我。 在此先感謝!

回答

1

DataGrid排序List<T>的視圖,當您單擊列標題時不需要任何操作。這是內置功能,因此您不必處理排序事件。只需將ItemsSource設置或綁定到您的List<T>即可。

請注意,實際的源集合,即List<T>未被排序。無論何時綁定WPF中的某個集合,都會自動創建一個ICollectionView,它是按DataGrid排序的一個集合。

+0

我已經看過它,我用下面一行將我的泛型列表綁定到datagrid:LibraryView.SetValue(DataGrid.ItemsSourceProperty,_manager.Library.Songs);如何使用ICollectionView將視圖的排序鏡像到綁定的通用列表? – JC97

+0

如果您有其他問題,請提出一個新問題。請不要在評論欄中提出其他問題。 – mm8

1

通過這樣做:

LibraryView.ItemsSource = _manager.GetLibrarySongs(); 

你破壞了數據綁定。其實你不應該做排序。如果集合正確地綁定到數據網格,它應該能夠按照開箱即可按列排序條目。

+0

對不起,我想我解釋了我錯了......我'綁定'(也許不是正確的表述)通過設置ItemsSource這樣。我應該通過WPF綁定它嗎?如果這種「開箱即用」的分類工作,它是否將我的列表排序?因爲那是我真正需要的。 – JC97

+1

你不應該通過像這樣設置ItemsSource來「綁定」,你應該通過XAML進行綁定。你可以在代碼後面做到這一點。但是它比僅僅設置ItemsSource = something要複雜一點。一般來說,您應該閱讀xaml DataBinding或WPF DataBinding。 – Mathew

+0

好的,會的..我確信這樣設定,它也應該被綁定。謝謝反正 – JC97