我有一个ObservableCollection
位于 WPF 中的 ViewModel DataGrid
。具有DataGrid
三列:
- 职位栏;这是在运行时由一个显示行在我的 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>
因此,因为我的 Row 和 Name 列是 UserControls,所以 WPFDataGrid
不能对它们进行本地排序。所以为了方便排序,当点击一个列标题时,我做了一些ListCollectionView.CustomSort
魔术。
这是我的“名称”列的自定义排序器的样子:
// 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
......我哪里出错了?