如何按日期对ListBox项目进行分组

时间:2013-04-01 11:26:09

标签: c# silverlight windows-phone-7 xaml

我正在尝试做简单的任务应用。我有截止日期的任务,我想像这样显示:

this is what I want

我知道如何在列表框中显示数据,但我不知道如何按DueDate对它们进行分组,并显示DueDates像标题(如下图所示)。

这是我的带有tasks(tasks.xml)的XML文件:

<?xml version="1.0" encoding="utf-8"?>
<Tasks>
  <Task>
    <Name>first task</Name>
    <DueDate>05/03/2013 00:00:00</DueDate>
    <Created>03/27/2013 01:24:08</Created>
  </Task>
  <Task>
    <Name>second task</Name>
    <DueDate>05/17/2013 00:00:00</DueDate>
    <Created>03/27/2013 01:24:19</Created>
  </Task>
  <Task>
    <Name>third task</Name>
    <DueDate>05/17/2013 00:00:00</DueDate>
    <Created>03/27/2013 01:24:38</Created>
  </Task>
</Tasks>

这是我的数据模型(MainViewModel.cs):

public class MainViewModel : INotifyPropertyChanged
{
    public ObservableCollection<Task> Tasks { get; private set; }

    public MainViewModel()
    {
        this.Tasks = new ObservableCollection<Task>();
    }

    public bool IsDataLoaded
    {
        get;
        private set;
    }

    public void LoadData()
    {
        try
        {
            Tasks.Clear();

            var file = IsolatedStorageFile.GetUserStoreForApplication();
            XElement xElem;

            using (IsolatedStorageFileStream read = file.OpenFile("tasks.xml", FileMode.Open))
            {
                xElem = XElement.Load(read);
            }

            var tasks = from task in xElem.Elements("Task")
                        select task;

            foreach (XElement xElemItem in tasks)
            {
                string dueDate = "";
                DateTime convertedDate;

                if (DateTime.TryParse(xElemItem.Element("DueDate").Value.ToString(), out convertedDate))
                {
                    dueDate = convertedDate.ToShortDateString();
                }

                Tasks.Add(new Task
                {
                    Name = xElemItem.Element("Name").Value.ToString(),
                    DueDate = dueDate,
                    Created = xElemItem.Element("Created").Value.ToString()
                });
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }

        this.IsDataLoaded = true;
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged(String propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (null != handler)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

我该怎么做?

2 个答案:

答案 0 :(得分:0)

我个人会在Silverlight Toolkit for Windows Phone中使用LongListSelector控件。

这是一个很棒的introduction,也是一个guide on databinding and grouping,这就是你要找的。

答案 1 :(得分:0)

而不是一个ListBox使用两个 - 第二个应该在第一个ItemTemplate中使用。

使用这种方法,您的外部ListBox模板应该包含标题(组的日期)和内部ListBox。内在的应该有物品。

使用这种方法,您将不得不重新设计您的代码以包含分组数据。

我建议GroupOfTasks上课:

public class GroupOfTasks : INotifyPropertyChanged
{
    public string Date { get; set; }
    public string ObservableCollection<Task> { get; set; }

    // you have to implement INotifyPropertyChanged by yourself.
}

LoadData重新设计:

public ObservableCollection<GroupOfTasks> Groups { get; private set; }

public void LoadData()
{
    try
    {
        Groups.Clear();

        (...)

        Groups = (from t in tasks
                  group t by t.DueDate into g
                  select new GroupOfTasks { Date = g.Key, Items = g.ToList() }).ToList();
    }
}

使用Groups属性将您的第一个ListBox绑定到该属性,将当前外部Items ListBox的内部属性绑定到Item

这只是一个提示,显示可能的方法。