我正在尝试做简单的任务应用。我有截止日期的任务,我想像这样显示:
我知道如何在列表框中显示数据,但我不知道如何按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));
}
}
}
我该怎么做?
答案 0 :(得分:0)
我个人会在Silverlight Toolkit for Windows Phone中使用LongListSelector控件。
这是一个很棒的introduction,也是一个guide on databinding and grouping,这就是你要找的。 p>
答案 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
。
这只是一个提示,显示可能的方法。