【发布时间】:2011-01-02 23:37:46
【问题描述】:
我有一个 ObservableCollection 的 ViewModels,它们位于 WPF 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,所以 WPF DataGrid 无法对它们进行本地排序。所以为了方便排序,当点击列标题时,我做了一些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);
}
}
问题在于这速度非常慢。我不知道为什么。 DataGrid 中有 10 个项目,我的应用程序在使用时会停止 3-4 秒。我认为ListCollectionView.CustomSort 应该是对ObservableCollection 进行排序的最有效方法...我哪里出错了?
【问题讨论】:
标签: wpf sorting mvvm wpfdatagrid