C# 如何使用CollectionViewSource对LongListSelector进行排序

C# 如何使用CollectionViewSource对LongListSelector进行排序,c#,windows-phone-7,windows-phone-8,collectionviewsource,longlistselector,C#,Windows Phone 7,Windows Phone 8,Collectionviewsource,Longlistselector,我有一个LongListSelector,当前正在填充来自IsolatedStorage的图像。我想能够按日期升序或降序排序。我一直在寻求帮助。由于某些原因,我无法将我的LongListSelector的ItemsSource绑定到CollectionViewSource以实现排序功能 PictureRepository.cs(在应用程序启动时从IsolatedStorage加载图片) MainPage.xaml <phone:LongListSelector x:Name="Recent

我有一个
LongListSelector
,当前正在填充来自
IsolatedStorage
的图像。我想能够按日期升序或降序排序。我一直在寻求帮助。由于某些原因,我无法将我的
LongListSelector
ItemsSource
绑定到
CollectionViewSource
以实现排序功能

PictureRepository.cs(在应用程序启动时从
IsolatedStorage
加载图片)

MainPage.xaml

<phone:LongListSelector x:Name="Recent" Margin="0,0,0,72"
                                    LayoutMode="Grid" GridCellSize="108,108" 
                                    SelectionChanged="recent_SelectionChanged">

MainPage.xaml.cs

#region Fields

    public System.Windows.Data.CollectionViewSource Source { get; set; }

#endregion

protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        //Recent.ItemsSource = App.PictureList.Pictures;  //working, unsorted

        Source = new System.Windows.Data.CollectionViewSource();
        Source.Source = App.PictureList.Pictures; //Not Working
        //Need some sort of Cast to IList for LongListSelector?
        Recent.ItemsSource = Source.View as IList<??>();

        if (Settings.AscendingSort.Value)
        {
            //Recent.ItemsSource = PictureRepository.Instance.Pictures.OrderBy(x => x.DateTaken);
            //Recent.ItemsSource = App.PictureList.Pictures.OrderBy(x => x.DateTaken);
            Source.SortDescriptions.Clear();
            Source.SortDescriptions.Add(new SortDescription("Date", ListSortDirection.Ascending)); 
        }
        else
        {
            //Recent.ItemsSource = PictureRepository.Instance.Pictures.OrderByDescending(x => x.DateTaken);
            //Recent.ItemsSource = App.PictureList.Pictures.OrderByDescending(x => x.DateTaken);
            Source.SortDescriptions.Clear();
            Source.SortDescriptions.Add(new SortDescription("Date", ListSortDirection.Descending)); 

        }
    }
#区域字段
public System.Windows.Data.CollectionViewSource源{get;set;}
#端区
受保护的覆盖无效OnNavigatedTo(NavigationEventArgs e)
{
//最近的.ItemsSource=App.PictureList.Pictures;//正在工作,未排序
Source=新系统.Windows.Data.CollectionViewSource();
Source.Source=App.PictureList.Pictures;//不工作
//需要为LongListSelector对IList进行某种类型的强制转换吗?
最近的.ItemsSource=Source.View as IList();
if(设置.升序排序.值)
{
//最近的.ItemsSource=PictureRepository.Instance.Pictures.OrderBy(x=>x.DateTake);
//Recent.ItemsSource=App.PictureList.Pictures.OrderBy(x=>x.datetake);
Source.SortDescriptions.Clear();
Source.SortDescriptions.Add(新的SortDescription(“Date”,ListSortDirection.升序));
}
其他的
{
//最近的.ItemsSource=PictureRepository.Instance.Pictures.OrderByDescending(x=>x.DateTake);
//Recent.ItemsSource=App.PictureList.Pictures.OrderByDescending(x=>x.datetake);
Source.SortDescriptions.Clear();
Source.SortDescriptions.Add(新的SortDescription(“Date”,ListSortDirection.Descending));
}
}

是最好、最简单的解决方案。略微更改了我的实现,但效果很好。

这么多代码,这么少xaml(引入cvs是为了在xaml中允许排序等,否则您最好使用collectionview)。您不绑定的任何原因,如
Recent.ItemsSource=Source.View
?在设置
Source.Source=App.PictureList.Pictures之后
MainPage.xaml.cs
上导航到
事件,放置
Recent.ItemsSource=Source.View出现错误,说明
无法将类型“System.ComponentModel.ICollectionView”隐式转换为“System.Collection.IList”。存在显式转换(是否缺少转换?
)。不知道如何正确地转换这个?我试图引用使用
列表框的。似乎
ListBox
LongListSelector
的源属性不是同一类型
ListBox.ItemsSource
是类型
IEnumerable
,但
LongListSelector.ItemsSource
是类型
IList
。显然,
CollectionViewSource
需要显式转换为
IList
。如果将其转换为
IList
,它将不再是cvs了,是吗?是的,似乎lls的
ItemsSource
是某种“独立实现”(出于某种原因,lls不是从
ItemsControl
派生的),我会在一点时间内尝试找到解决方案。是的,当然。假设
Items
是一个
observedcollection
,并且
Pictures
类有一些名为data的字段,那么您可以按以下方式进行排序:
Items.OrderBy(pic=>pic.Date)
。您还可以执行类似于
.OrderBy()。然后执行降序()
等操作
<phone:LongListSelector x:Name="Recent" Margin="0,0,0,72"
                                    LayoutMode="Grid" GridCellSize="108,108" 
                                    SelectionChanged="recent_SelectionChanged">
#region Fields

    public System.Windows.Data.CollectionViewSource Source { get; set; }

#endregion

protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        //Recent.ItemsSource = App.PictureList.Pictures;  //working, unsorted

        Source = new System.Windows.Data.CollectionViewSource();
        Source.Source = App.PictureList.Pictures; //Not Working
        //Need some sort of Cast to IList for LongListSelector?
        Recent.ItemsSource = Source.View as IList<??>();

        if (Settings.AscendingSort.Value)
        {
            //Recent.ItemsSource = PictureRepository.Instance.Pictures.OrderBy(x => x.DateTaken);
            //Recent.ItemsSource = App.PictureList.Pictures.OrderBy(x => x.DateTaken);
            Source.SortDescriptions.Clear();
            Source.SortDescriptions.Add(new SortDescription("Date", ListSortDirection.Ascending)); 
        }
        else
        {
            //Recent.ItemsSource = PictureRepository.Instance.Pictures.OrderByDescending(x => x.DateTaken);
            //Recent.ItemsSource = App.PictureList.Pictures.OrderByDescending(x => x.DateTaken);
            Source.SortDescriptions.Clear();
            Source.SortDescriptions.Add(new SortDescription("Date", ListSortDirection.Descending)); 

        }
    }