私はObservableCollection
WPF に座っている ViewModelsを持っていDataGrid
ます。には次のDataGrid
3 つの列があります。
- 位置列; これは、DataGrid の行の位置を表示する UserControl によって実行時にレンダリングされます
- 名前列; これは、列の名前を表示する UserControl によって実行時にレンダリングされます (はい、名前を表示する方法に基づいて、これには UserControl が必要ですが、それは余談です)
- データ列; これは、さらに別の UserControl によって実行時にレンダリングされます。
私の列は次のように定義されています。
<toolkit:DataGrid.Columns>
<toolkit:DataGridTemplateColumn Header="" MinWidth="35" MaxWidth="35" SortMemberPath="Position.PositionIndex" CanUserSort="True">
<toolkit:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ContentPresenter Content="{Binding Path=Position}"/>
</DataTemplate>
</toolkit:DataGridTemplateColumn.CellTemplate>
</toolkit:DataGridTemplateColumn>
<toolkit:DataGridTemplateColumn Header="Name" MinWidth="150" Width="150" SortMemberPath="Name" CanUserSort="True">
<toolkit:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ContentPresenter Content="{Binding Path=Name}"/>
</DataTemplate>
</toolkit:DataGridTemplateColumn.CellTemplate>
</toolkit:DataGridTemplateColumn>
<toolkit:DataGridTemplateColumn Header="Data" Width="Auto" CanUserSort="False">
<toolkit:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ContentPresenter Content="{Binding Path=Data}"/>
</DataTemplate>
</toolkit:DataGridTemplateColumn.CellTemplate>
</toolkit:DataGridTemplateColumn>
</toolkit:DataGrid.Columns>
したがって、行と名前の列は UserControls であるため、WPFDataGrid
はそれらをネイティブに並べ替えることができません。そのため、並べ替えを容易にするために、列ヘッダーがクリックされたときにListCollectionView.CustomSort
魔法をかけます。
Name 列のカスタム ソーターは次のようになります。
// Customized sorter, by name, ascending.
public class AscendingNameSorter : IComparer
{
public int Compare(object x, object y)
{
var lhs = (MyViewModel)x;
var rhs = (MyViewModel)y;
return lhs.Name.CompareTo(rhs.Name);
}
}
// Customized sorter, by name, descending.
public class DescendingNameSorter : IComparer
{
public int Compare(object x, object y)
{
var lhs = (MyViewModel)x;
var rhs = (MyViewModel)y;
return rhs.Name.CompareTo(lhs.Name);
}
}
問題は、これが信じられないほど遅いことです。理由がわかりません。に 10 個のアイテムがあるDataGrid
と、私のアプリケーションは実行中に 3 ~ 4 秒間停止します。ListCollectionView.CustomSort
をソートする最も効率的な方法だと思っていましたObservableCollection
...どこが間違っていますか?