2009-10-27 39 views
8

Đây là phương pháp sắp xếp mặc định khi bạn nhấp vào tiêu đề cột trong một DataGrid. Khi danh sách cơ bản chứa 100.000 mục, sẽ mất khoảng 20 giây để làm mới chế độ xem. Bạn có thể quan sát thấy sự chậm trễ tương tự khi đặt SortDescription s trên CollectionView.Tại sao sắp xếp bằng CollectionViewSource.SortDescriptions chậm?

Sắp xếp bằng cách sử dụng ListCollectionView.CustomSort hoặc bằng cách sắp xếp và xác nhận lại danh sách hoạt động gần như ngay lập tức.

Tại sao sự chậm trễ này? Đây có phải chỉ là "thuế phản chiếu" trên các thuộc tính bị ràng buộc không?

Trả lời

9

Bạn nói đúng, đây là thuế phản ánh. Tôi nhìn rất chặt chẽ về hiệu suất DataGrid một thời gian trước đây, và sự phản chiếu là một cái cổ chai ở đây. Bất kể thuật toán phân loại nhanh như thế nào, chúng cũng không lưu trữ giá trị của thuộc tính giữa hai so sánh. Vì vậy, ngay cả khi bạn có n * ln (n) so sánh, với n == 100 000 bạn sẽ nhận được ~ 1 000 000 hoạt động. Mỗi toán hạng sử dụng sự phản chiếu để có được giá trị, vì vậy bạn có 2 000 000 cuộc gọi để phản ánh trong thuế :) ... ListCollectionView.CustomSort là giải pháp lý tưởng ở đây.

PS: Vào cuối ngày, chúng tôi đã viết lưới ListView dựa trên, vì chúng tôi không hài lòng với DataGrid render hiệu suất quá ... Nhưng đó là một câu chuyện khác :)

1

Các tinh chỉnh hiệu suất tốt nhất cho việc lọc, đã chuyển đổi DataGridRow Visibility. Nó tạo ra tầm quan trọng của sự khác biệt!

1.Thêm thuộc tính có thể chia sẻ vào mục bộ sưu tập mà bạn liên kết ItemSource của DataGrid với.

private bool _isVisible = true; 
public bool IsVisible 
{ 
    get { return _isVisible; } 
    set 
    { 
     if (_isVisible == value) 
      return; 
     _isVisible = value; 
     RaisePropertyChanged(()=>IsVisible); 
    } 
} 

2.Trigger Visibility của DataGridRow bằng cách gắn nó vào bất động sản IsVisible của bạn:

<DataGrid.ItemContainerStyle> 
<Style TargetType="{x:Type DataGridRow}"> 
    <Setter Property="Visibility" 
       Value="{Binding Path=IsVisible, 
           Converter={StaticResource BoolToVisibility}}"/> 
</Style> 
</DataGrid.ItemContainerStyle> 

3.Well, bạn gotta thiết lập IsVisible nơi nào đó tôi đoán quá, giống như trong ViewModel của bạn. Đây chỉ là mẫu của những gì tôi đang làm (chỉ cần sao chép/dán công việc) - về cơ bản thiết lập IsVisible thành true hoặc false dựa trên một số tiêu chí trong ViewModel của tôi:

FilterViewModel.OnFilter += (s, a) => 
{ 
    foreach (Row row in ViewModel.Rows) 
    row.IsVisible = !FilterViewModel.FilteringItems.Any(item => 
            item.IsSelected && item.Name == row.Name); 
}; 
+0

Điều này làm việc cho tôi. Đây là cách một vấn đề tương tự có thể được giải quyết trong Angular bằng cách này :). – Den

Các vấn đề liên quan