0

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

这就是我要的

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

这是我的带有任务的 XML 文件 (tasks.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));
        }
    }
}

我该怎么做?

4

2 回答 2

0

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

这是一个很好的介绍,也是您正在寻找的数据绑定和分组指南。

于 2013-04-01T11:35:49.847 回答
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

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

于 2013-04-01T11:39:11.720 回答