관찰 가능한 개체 목록에 바인딩 된 DataGrid가 있습니다. ItemsControl이 해당 목록에 바인딩되어 있으면 (DataGrid 헤더를 클릭하여) 정렬 성능이 매우 낮습니다 (아래 샘플의 경우 몇 초 정도). ItemsControl이 같은 목록에 바인딩되어 있지 않으면 정렬은 즉시입니다. 여기 ItemsControl도 동일한 ItemsSource에 바인딩하는 경우 DataGrid 정렬이 매우 느립니다.
이 동작을namespace LargeDataGridViewTest
{
public partial class MainWindow
{
public MainWindow()
{
InitializeComponent();
DataContext = new MainPresenter();
}
}
public class MainPresenter : INotifyPropertyChanged
{
private readonly ObservableCollection<Item> _items = new ObservableCollection<Item>();
public IEnumerable<Item> Items { get { return _items; } }
public MainPresenter()
{
for (var i = 0; i < 10000; i++)
_items.Add(new Item());
}
}
public class Item : INotifyPropertyChanged
{
public int Random { get; private set; }
private static readonly Random Rand = new Random();
public Item()
{
Random = Rand.Next(0, 1000000);
}
}
}
을 나타내는 몇 가지 예제 코드와 해당 XAML
<Window.Resources>
<DataTemplate DataType="{x:Type LargeDataGridViewTest:MainPresenter}">
<DockPanel>
<DataGrid ItemsSource="{Binding Items}"/>
<!--ListBox ItemsSource="{Binding Items}"/-->
<ItemsControl ItemsSource="{Binding Items}"/>
</DockPanel>
</DataTemplate>
</Window.Resources>
<ContentPresenter Content="{Binding}"/>
대신 ItemsControl에의 나는 목록 상자를 사용하는 경우, 정렬 성능이 괜찮이다. ListBox를 사용하지만 ItemsPanelTemplate을 변경하여 기본 ItemsControl에 액세스하면 성능이 나 빠지게됩니다.
(동일한 항목을 참조하는) 목록의 단순 복사본을 가져 와서 대신 ItemsControl을 바인딩하면 성능이 좋습니다.
속도가 느린 ItemsControl 바인딩과 EQATEC 프로파일 러를 통한 빠른 ListBox 바인딩을 모두 실행하면 최상위 수준의 앱 시간 이외의 성능에는 차이가 없습니다.
여기에 무슨 일이 일어나는 지 아는 사람이 있습니까? 대답의
편집
일부는 ItemsControls는 가상화 따라서 단지 눈에 보이는 것보다는 모든 항목을 그릴 필요가 있지 않은지 것으로 보인다. 이 경우 ItemsControl 바인딩 모드가 OneTime 인 경우에도 DataGrid가 정렬 될 때 모든 ItemsControl 항목이 다시 그려지는 이유는 무엇입니까? 그리고 DataGrid 정렬의 성능에 영향을주는 것을 어떻게 막을 수 있습니까?
그러면 ItemsPanelTemplate을 변경할 때 ListBox의 가상화가 손실됩니다. – Scroog1
@ Scroog1 나는 그렇게 생각하지 않는다. 가상화는'ControlTemplate'의 일부이기 때문에'ItemsPanelTemplate'을 변경해도 영향을 미치지 않습니다. – Rachel
그러나 위 예제를 ItemsPanelTemplate (예 : )의 ListBox로 변경하면 정렬 성능이 다시 떨어집니다. – Scroog1