暂时排序WP8列表框

时间:2014-02-24 22:37:32

标签: c# windows-phone-8 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);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

您可以将ObservableCollection(或其他可枚举类型)保留为类级变量,而不必在代码中设置Templates.ItemsSource = storage.GetItems();

//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。 (See this了解有关绑定的更多信息)

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

然后,您可以使用ObservableCollection的内置排序方法来设置项目的排序顺序。您可能需要实现Property Changed处理程序,您可以查看this tutorial以获取更多信息。