如何在Windows Phone中对LongListSelector进行排序
我希望能够按升序或降序对绑定到LongListSelector的数据进行排序。 我无法将排序数据绑定到我的LongListSelector。 最初没有尝试实现排序,我的解决方案正在运行,但我相信在涉及排序时我遗漏了一些东西。 我还尝试了如何使用CollectionViewSource对LongListSelector进行排序而没有运气。 排序LongListSelector的最佳方法是什么?
MainPage.xaml中
MainPage.xaml.cs(OLD)
protected override void OnNavigatedTo(NavigationEventArgs e) { Recent.ItemsSource = App.PictureList.Pictures; //works! if (Settings.AscendingSort.Value) { //Recent.ItemsSource = App.PictureList.Pictures.OrderBy(x => x.DateTaken); //Error stating Cannot implicityly convert type 'SYstem.Linq.IOrderedEnumerable to System.Collections.IList Recent.ItemsSource = App.PictureList.Pictures.OrderBy(x => x.DateTaken) as System.Collections.IList; //No error but nothing is displayed } else { //Recent.ItemsSource = App.PictureList.Pictures.OrderByDescending(x => x.DateTaken); Recent.ItemsSource = App.PictureList.Pictures.OrderByDescending(x => x.DateTaken) as System.Collections.IList; } }
**编辑
MainPage.xaml.cs(新)
protected override void OnNavigatedTo(NavigationEventArgs e) { //Recent.ItemsSource = App.PictureList.Pictures; //Works with deleting, not sorted. if (Settings.AscendingSort.Value) { //Recent.ItemsSource = App.PictureList.Pictures.OrderBy(x => x.DateTaken).ToList(); //Recent.ItemsSource = new ObservableCollection(App.PictureList.Pictures.OrderBy(x => x.DateTaken)); App.PictureList.Pictures = new ObservableCollection(App.PictureList.Pictures.OrderBy(x => x.DateTaken)); //Error Recent.ItemsSource = App.PictureList.Pictures; } else { //Recent.ItemsSource = App.PictureList.Pictures.OrderByDescending(x => x.DateTaken).ToList(); //Recent.ItemsSource = new ObservableCollection(App.PictureList.Pictures.OrderByDescending(x => x.DateTaken)); App.PictureList.Pictures = new ObservableCollection(App.PictureList.Pictures.OrderByDescending(x => x.DateTaken)); //Error Recent.ItemsSource = App.PictureList.Pictures; } }
App.xaml.cs
public static PictureRepository PictureList { get { return PictureRepository.Instance; } }
PictureRepository.cs
#region Constants public const string IsolatedStoragePath = "Pictures"; #endregion #region Fields //private readonly ObservableCollection _pictures = new ObservableCollection(); private ObservableCollection _pictures = new ObservableCollection(); #endregion #region Properties public ObservableCollection Pictures { //get { return _pictures; } get { return _pictures; } set { new ObservableCollection(_pictures); } } #endregion #region Singleton Pattern private PictureRepository() { LoadAllPicturesFromIsolatedStorage(); } public static readonly PictureRepository Instance = new PictureRepository(); #endregion /// /// Saves to local storage /// This method gets two parameters: the captured picture instance and the name of the pictures folder in the isolated storage /// /// /// public void SaveToLocalStorage(CapturedPicture capturedPicture, string directory) { //call IsolatedStorageFile.GetUserStoreForApplication to get an isolated storage file var isoFile = IsolatedStorageFile.GetUserStoreForApplication(); //Call the IsolatedStorageFile.EnsureDirectory extension method located in the Common IsolatedStorageFileExtensions class to confirm that the pictures folder exists. isoFile.EnsureDirectory(directory); //Combine the pictures folder and captured picture file name and use this path to create a new file string filePath = Path.Combine(directory, capturedPicture.FileName); using (var fileStream = isoFile.CreateFile(filePath)) { using (var writer = new BinaryWriter(fileStream)) { capturedPicture.Serialize(writer); } } } /// /// To load all saved pictures and add them to the pictures list page /// public CapturedPicture LoadFromLocalStorage(string fileName, string directory) { //To open the file, add a call to the IsolatedStorageFile.GetUserStoreForApplication var isoFile = IsolatedStorageFile.GetUserStoreForApplication(); //Combine the directory and file name string filePath = Path.Combine(directory, fileName); //use the path to open the picture file from the isolated storage by using the IsolatedStorageFile.OpenFile method using (var fileStream = isoFile.OpenFile(filePath, FileMode.Open, FileAccess.Read)) { //create a BinaryReader instance for deserializing the CapturedPicture instance using (var reader = new BinaryReader(fileStream)) { var capturedPicture = new CapturedPicture(); //create a new instance of the type CapturedPicture called CapturedPicture.Deserialize to deserialize the captured picture and return it capturedPicture.Deserialize(reader); return capturedPicture; } } } /// /// To load all the pictures at start time /// private void LoadAllPicturesFromIsolatedStorage() { //add call to the IsolatedStorageFile.GetUserStoreForApplication to open an isolated storage file var isoFile = IsolatedStorageFile.GetUserStoreForApplication(); //Call the IsolatedStorageFile.EnsureDirectory extension method located in the Common IsolatedStorageFileExtensions class to confirm that the pictures folder exists isoFile.EnsureDirectory(IsolatedStoragePath); //Call the IsolatedStorageFile.GetFileNames using the pictures directory and *.jpg as a filter to get all saved pictures var pictureFiles = isoFile.GetFileNames(Path.Combine(IsolatedStoragePath, "*.jpg")); //var pictureFiles = isoFile.GetFileNames(Path.Combine(IsolatedStoragePath, "")); //Iterate through all the picture files in the list and load each using the LoadFromLocalStorage you created earlier foreach (var pictureFile in pictureFiles) { var picture = LoadFromLocalStorage(pictureFile, IsolatedStoragePath); _pictures.Add(picture); } }
将Recent.ItemsSource = App.PictureList.Pictures.OrderBy(x => x.DateTaken)替换为System.Collections.IList;
by Recent.ItemsSource = App.PictureList.Pictures.OrderBy(x => x.DateTaken).ToList()
当你使用OrderBy时,它返回一个IEnumerable而不是List,所以App.PictureList.Pictures.OrderBy(x => x.DateTaken) as System.Collections.IList
只返回null