簡體   English   中英

如何在Windows Phone中對LongListSelector進行排序

[英]How to Sort a LongListSelector in Windows Phone

我希望能夠以升序或降序對綁定到LongListSelector的數據進行排序。 我在將排序后的數據綁定到我的LongListSelector時遇到麻煩。 最初,我沒有嘗試實現排序,但是我的解決方案卻可以正常工作,但是我認為在進行排序時,我會丟失一些東西。 我也嘗試過如何使用CollectionViewSourceLongListSelector進行排序 ,但是沒有運氣。 排序LongListSelector的最佳方法是什么?

MainPage.xaml

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

MainPage.xaml.cs(舊)

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<Models.Picture>(App.PictureList.Pictures.OrderBy(x => x.DateTaken));
        App.PictureList.Pictures = new ObservableCollection<Models.Picture>(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<Models.Picture>(App.PictureList.Pictures.OrderByDescending(x => x.DateTaken));
        App.PictureList.Pictures = new ObservableCollection<Models.Picture>(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<Picture> _pictures = new ObservableCollection<Picture>();
private ObservableCollection<Picture> _pictures = new ObservableCollection<Picture>();

#endregion

#region Properties

public ObservableCollection<Picture> Pictures
{
    //get { return _pictures; }
    get { return _pictures; }
    set { new ObservableCollection<Picture>(_pictures); }
}

#endregion

#region Singleton Pattern

private PictureRepository()
{
    LoadAllPicturesFromIsolatedStorage();
}

public static readonly PictureRepository Instance = new PictureRepository();

#endregion

/// <summary>        
/// Saves to local storage
/// This method gets two parameters: the captured picture instance and the name of the pictures folder in the isolated storage
/// </summary>
/// <param name="capturedPicture"></param>
/// <param name="directory"></param>
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);
        }
    }
}

/// <summary>
/// To load all saved pictures and add them to the pictures list page
/// </summary>
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;
        }
    }
}

/// <summary>
/// To load all the pictures at start time
/// </summary>
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);
    }
}

替換Latest.ItemsSource = App.PictureList.Pictures.OrderBy(x => x.DateTaken)作為System.Collections.IList;

通過Latest.ItemsSource = App.PictureList.Pictures.OrderBy(x => x.DateTaken).ToList()

當您使用OrderBy時,它返回IEnumerable而不是List,因此App.PictureList.Pictures.OrderBy(x => x.DateTaken) as System.Collections.IList只會返回null

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM