2012-04-20 1 views
0

WPF Toolkit의 DataGrid에서 상속하는 사용자 지정 그리드에 약 10000 개의 항목이 있습니다. 내장 정렬은 매우 느립니다. 이와 같이 각 열에 대해 모든 DataRowView 항목을 실행하는 별도의 클래스를 작성했습니다 (그리드에서 추가 및 제거가 거의 발생하지 않았기 때문에 가능합니다).WPF DataGrid 사용자 지정 정렬 : ItemsSource의 항목 재정렬

그리드는 AutoGenerateColumns='True'이고 DefaultViewDataTable입니다.

열 머리글을 클릭하면 모눈의 ItemsSource을 내 정렬 된 DataRowView 목록으로 바꿔서 OnSorting을 무시합니다. 아래는 방법입니다.

private void RefreshItems() 
    { 
     if (_updating || _multiIndexer.Count == 0) 
      return; 

     try 
     { 
      _updating = true; 
      this.AutoGenerateColumns = false; 

      // replace the itemssource with my maintained and sorted list of 
      // DataRowView items 
      this.ItemsSource = _multiIndexer.ToList(); 
     } 
     finally 
     { 
      //this.AutoGenerateColumns = true; 
      _updating = false; 
     } 
    } 

문제는 자동 생성에서 존재했던 열을 파괴한다는 것입니다. 또한 DataRowView의 속성과 일치하는 열만 남았습니다.

DataRowView의 정렬 목록에서 DataView을 만들고이를 ItemsSource으로 전달하는 것이 가장 효과적이라고 생각하지만 아직 성공하지 못했습니다.

자동 생성 된 열을 삭제하지 않고 ItemsSource 또는 Items에 새 행 목록을 전달하는 방법에 대한 아이디어가 있으십니까? 수동으로 모든 열을 생성하는 것은 옵션이 아닙니다. 내가 방법을 알고 아니에요

건배, 숀

답변

0

는 열을 재 작성을 제거합니다. 나는 비슷한 문제가 있는데, 보통 ICollectionView와 DeferRefresh를 사용하고 있습니다. 왜냐하면 실제 모델 객체에서 수행 할 필요가 없기 때문입니다. 그러나 List와 마찬가지로 DataViews와 잘 작동하는지 잘 모르겠습니다.

0

"매우 느린"이란 무엇입니까?

내가 DataGrid를 가져 와서 50000row와 20columns를 가진 datatable을 바인딩하면. 그것은

뷰 모델

public class Viewmodel 
{ 
    public DataTable MyData { get; set; } 

    public Viewmodel() 
    { 
     this.MyData = new DataTable(); 

     for (int i = 0; i < 20; i++) 
     { 
      this.MyData.Columns.Add("Col" + i); 
     } 

     for (int i = 0; i < 50000; i++) 
     { 
      var row = MyData.NewRow(); 
      for (int j = 0; j < 20; j++) 
      { 

       row["Col" + j] = string.Format("{0} Row, Col {1}", i, j); 
      } 
      this.MyData.Rows.Add(row); 

     } 
    } 
} 

윈도우 나에게 빠른 것 같다

<DataGrid ItemsSource="{Binding MyData}" AutoGenerateColumns="True"> 

    </DataGrid> 

편집 : 그 .net4.0

+0

이 바로 우리가 두 방향에서 여러 열을 기준으로 정렬을 시작으로, 내장 - 정렬이 매우 느립니다. 우리가 선택한 골목은 정렬하기 위해 4-10 배 더 빠릅니다 (그리드가 자체 정렬을 완료하는 데 걸린 시간과 비교할 때이 목록을 표시하지 않고 ...) 결과가 사실인지 확인하십시오). 이것은 내가 왜 파괴하거나 열을 재건하지 않고있어 datarows의 목록을 표시해야합니다 –