我想按字母顺序排列 ObservableCollection,因为我不想创建另一个绑定。我已经看到我们可以使用 Linq 和 OrderBy 方法。我还想使用个人 IComparer 因为我将不得不组织复杂的数据(列表到其他列表中),但是 VS 告诉我我不能使用我自己的比较器:
(给你错误的链接,因为我的VS是法语的)
http://msdn.microsoft.com/en-gb/library/hxfhx4sy%28v=vs.90%29.aspx
有任何想法吗 ?
private void SortGraphicObjectsAscending(object sender, RoutedEventArgs e)
{
GraphicObjects.OrderBy(graphicObject => graphicObject.Nom, new GraphicObjectComparer(true));
}
还有我自己的比较器(已经过测试)
public class GraphicObjectComparer : IComparer<GraphicObject>
{
int order = 1;
public GraphicObjectComparer(Boolean ascending)
{
if (!ascending)
{
order = -1;
}
}
public GraphicObjectComparer()
{
}
public int Compare(GraphicObject x, GraphicObject y)
{
return String.Compare(x.Nom, y.Nom, false) * order;
}
}
感谢您的回答。无论如何,我还有另一个问题。正如迈克尔所说,我使用了一个更复杂的比较器,但用于另一个实体。该实体以分层树的形式显示,并且一个对象可能包含相同类型的其他对象的列表。
我无法测试我的 GraphicObject,因为我无权访问数据库(目前没有对象)。通过对我的 VideoEntity 的测试,我的 ObservableCollection 似乎没有按照我想要的方式排序(我创建了另一个)。我想按字母顺序颠倒它,但它不起作用。
public class VideoEntityComparer : IComparer<VideoEntity>
{
int order = 1;
public VideoEntityComparer(Boolean ascending)
{
if (!ascending)
{
this.order = -1; // so descending
}
}
public VideoEntityComparer()
{
}
public int Compare(VideoEntity x, VideoEntity y)
{
if ((x is BaseDirectory && y is BaseDirectory) || (x is BaseSite && y is BaseSite) || (x is VideoEncoder && y is VideoEncoder))
{
return string.Compare(x.Nom, y.Nom, false) * order; // only objects of the same type are sorted alphabetically
}
else if ((x is BaseDirectory && y is BaseSite) || (x is BaseSite && y is VideoEncoder))
{
return -1;
}else
{
return 1;
}
}
}
private void SortDirectoriesDescending(object sender, RoutedEventArgs e)
{
ObservableCollection<BaseDirectory> tempDir = new ObservableCollection<BaseDirectory>(
Directories.OrderBy(directory => directory, new VideoEntityComparer(false)));
Directories = tempDir;
}
PS:顺便说一句,我正在处理一个 DependancyProperty。这是正确的方法吗?(我是 WPF 的新手)