簡體   English   中英

臨時排序WP8列表框

[英]Temporarily Sort WP8 Listbox

我有一個基於本地數據庫示例( http://code.msdn.microsoft.com/wpapps/Local-Database-Sample-57b1614c )構建的WP C#應用程序。

主頁顯示xml數據庫中的項目列表,默認情況下按創建的順序顯示項目。 我希望能夠提供至少一種其他排序順序-顛倒或按“主題”排序。 不幸的是,WP不支持Listbox.Sort。

我已經嘗試過在這里找到各種答案,包括嘗試對xml文件本身進行排序,但是由於超出我的編碼水平,它們不會更改列表的順序(請參閱Templatestorage),但是我懷疑這是由於執行不當所致。

列表框的代碼是:

<ListBox x:Name="Templates" SelectionChanged="OnSelectionChanged" Background="Transparent" Style="{StaticResource ListBoxStyle1}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel>
        <TextBlock Grid.Row="2" Text="{Binding Subject}" Style="{StaticResource PhoneTextLargeStyle}" Margin="12,2" />
        <TextBlock Grid.Row="2" Text="{Binding DT}" Style="{StaticResource PhoneTextSmallStyle}" Margin="12,5" />
                <Rectangle Height="1" Margin="23,7,50,7" Fill="{StaticResource PhoneAccentBrush}" MinWidth="400" />
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

C#是:

public partial class MainPage
{
    private readonly TemplateStorage storage = new TemplateStorage();

    public MainPage()
    {

        InitializeComponent();

        Loaded += OnLoaded;
    }

    private void OnLoaded(object sender, RoutedEventArgs e)
    {

        Templates.ItemsSource = storage.GetItems();
        this.NavigationService.RemoveBackEntry();
    }

    private void PhoneApplicationPage_GotFocus(object sender, RoutedEventArgs e)
    {
        Templates.ItemsSource = storage.GetItems();            
    }
}

Templatestorage顯示了各種排序(注釋)嘗試:

public class TemplateStorage
{
    private IList<NanoMemoTemplate> templates;
    private const string Filename = "template-list.xml";

    protected IList<NanoMemoTemplate> Templates
    {
        get
        {
            return templates ?? (templates = LoadTemplates().ToList());
        }
        set
        {
            templates = value;
        }
    }


    protected IEnumerable<NanoMemoTemplate> LoadTemplates()
    {
        using(var applicationStorage = IsolatedStorageFile.GetUserStoreForApplication())
        {
            if(!applicationStorage.FileExists(Filename))
                return Enumerable.Empty<NanoMemoTemplate>();



            using(var speedListFile = applicationStorage.OpenFile(Filename, FileMode.Open, FileAccess.Read))
            {
                var document = XDocument.Load(speedListFile);

                return from t in document.Root.Elements("template")
                        select new NanoMemoTemplate
                        {
                            Id = new Guid(t.Attribute("id").Value),
                            Subject = t.Attribute("subject").Value,
                            Body = t.Attribute("body").Value,
                            DT = t.Attribute("dateCreated").Value,
                        };
            }
        }
    }

    //public IEnumerable<NanoMemoTemplate> SortTemplates()
    //{

    //    using (var applicationStorage = IsolatedStorageFile.GetUserStoreForApplication())
    //    {
    //        if (!applicationStorage.FileExists(Filename))
    //            return Enumerable.Empty<NanoMemoTemplate>();

    //        using (var speedListFile = applicationStorage.OpenFile(Filename, FileMode.Open, FileAccess.ReadWrite))
    //        {
    //            var documentSort = XDocument.Load(speedListFile);
    //            XDocument datatemp = new XDocument(documentSort);
    //            var subjectSort = from p in datatemp.Descendants("template")
    //                              orderby (string)p.Attribute("subject")
    //                              select p;
    //            //var subjectSort = datatemp.Elements("template").OrderBy(p => (string)p.Attribute("subject")).ToArray();
    //            string cleanDataDump = subjectSort.ToString();
    //            MessageBox.Show(cleanDataDump);
    //            documentSort.Descendants("template").Remove();
    //            documentSort.Element("template").Add(subjectSort);

    //            return Templates;
    //        }

    //    }


    //}

    //public IEnumerable<NanoMemoTemplate> SortItems()
    //{

    //    //Sort XML order so order is saved
    //    using (var applicationStorage = IsolatedStorageFile.GetUserStoreForApplication())
    //    {
    //        if (!applicationStorage.FileExists(Filename))
    //            return Enumerable.Empty<NanoMemoTemplate>();

    //        using (var speedListFile = applicationStorage.OpenFile(Filename, FileMode.Open, FileAccess.ReadWrite))
    //        {
    //            var documentSort = XDocument.Load(speedListFile);
    //            IEnumerable<string> codes = from code in documentSort.Elements("template")
    //                                        let subs = (string)code.Element("subject")
    //                                        orderby subs
    //                                        select subs;

    //            //return Templates as per usual as sorting is done at DB level
    //            return from t in documentSort.Root.Elements("template")
    //                   select new NanoMemoTemplate
    //                   {
    //                       Id = new Guid(t.Attribute("id").Value),
    //                       Subject = t.Attribute("subject").Value,
    //                       Body = t.Attribute("body").Value,
    //                       DT = t.Attribute("dateCreated").Value,
    //                   };


    //        }
    //    }
    //}



    public IEnumerable<NanoMemoTemplate> GetItems()
    {
        return Templates;
    }

    public void Save(NanoMemoTemplate template)
    {
        Templates.Add(template);
    }

    public void Delete(NanoMemoTemplate template)
    {
        Templates.Remove(template);
    }

    //public void Sort(NanoMemoTemplate template)
    //{
    //    IList<NanoMemoTemplate> list = new List<NanoMemoTemplate>();
    //    IEnumerable<NanoMemoTemplate> sortedEnum = list.OrderBy(Templates => Templates.Subject);
    //    IList<NanoMemoTemplate> sortedList = sortedEnum.ToList();
    //}

    public void SaveChanges()
    {
        using(var applicationStorage = IsolatedStorageFile.GetUserStoreForApplication())
        using(var speedListFile = applicationStorage.OpenFile(Filename, FileMode.Create, FileAccess.Write))
        {
            var document = new XDocument(new XDeclaration("1.0", "utf-8", "yes"),
                new XElement("templates",
                    from t in Templates
                    select new XElement("template",
                        new XAttribute("id", t.Id),
                        new XAttribute("subject", t.Subject),
                        new XAttribute("body", t.Body),
                        new XAttribute("dateCreated", t.DT))));

            document.Save(speedListFile);
        }
    }
}

無需設置Templates.ItemsSource = storage.GetItems(); 在您的代碼中,可以將ObservableCollection(或其他可枚舉類型)保留為類級變量:

//StorageTemplates should be a class-level variable
ObservableCollection<NanoMemoTemplate> StorageTemplates;

//You can assign the value to StorageTemplates when the page loads
StorageTemplates = storage.GetItems();

然后,您將在XAML中將ItemsSource="{Binding StorageTemplates}"數據綁定應用於您的ListBox。 有關綁定的更多信息, 請參見此內容)

<ListBox x:Name="Templates" ItemsSource="{Binding StorageTemplates, UpdateSourceTrigger="PropertyChanged"}" SelectionChanged="OnSelectionChanged" Background="Transparent" Style="{StaticResource ListBoxStyle1}" >
    <ListBox.ItemTemplate>
        ....
    </ListBox.ItemTemplate>
</ListBox>

然后,您可以使用ObservableCollection的內置Sort方法來設置項目的排序順序。 您可能需要實現屬性更改處理程序,可以查看本教程以獲取更多信息。

暫無
暫無

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

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