概述
本文档主要简述CMDCalendar详情页面的构成以及增删查改功能的实现。
场景
工作项序号:001 对待办日程/任务的增删查改
背景:
-
典型用户:
特别周[主要]
无声铃鹿[主要]
草上飞[主要]
-
用户需求:a.特别周:今天的训练,七点前要完成!
b.特别周:今天,明天……干脆接下来的一个月都五点钟起来训练好了!
c.无声铃鹿:小特又在勉强自己了……这条日程,帮她修改掉吧。
d.草上飞:和铃鹿同学一起吃晚饭……那我呢?趁没人看见,偷偷删掉吧……
-
假设条件:用户会使用本软件。
场景:特别周打开本软件,使用添加任务功能添加了七点前完成训练的任务。
特别周想了想,添加了从今天开始的持续一个月的五点起床训练的日程。
无声铃鹿看见了特别周的日程,将日程内容修改为了六点起床,截止日期修改为了两星期之后。
草上飞看见了特别周任务里“和铃鹿同学一起吃晚饭”的任务,偷偷删掉了它。
功能说明书
目标:新建日程/任务
角色:用户
操作流程: 1.打开软件;
2.点击新建,跳转到新建界面;
3.输入标题,日期,详细信息等内容;
4.点击“保存并退出”,保存内容并回到主界面;
5.开始日期如晚于结束日期,会提醒用户出错;
6.若编辑了内容但没有选择“保存并退出”而是选择了“返回”,会提醒用户没有保存。
标题:修改日程/任务
角色:用户
操作流程: 1.打开软件;
2.点击已有的日程/任务,跳转到详情界面;
3.更改想要更改的内容;
4.点击“保存并退出”,保存内容并回到主界面;
5.开始日期如晚于结束日期,会提醒用户出错;
6.若编辑了内容但没有选择“保存并退出”而是选择了“返回”,会提醒用户没有保存。
标题:删除日程/任务
角色:用户
操作流程: 1.打开软件;
2.点击已有的日程/任务,跳转到详情界面;
3.点击删除,删除当前日程/任务并回到主界面。
技术说明书
VIEW
1.日历视图
左侧Gri(0,1)中放置一个calendarview,可用于选择日期,选中的日期会同步到右侧的所有日期选择框,包括日程的开始/结束时间以及任务的结束时间。另外,除了返回按钮之外的所有按钮都是装饰用的。
private void DateChoosing_SelectedDatesChanged(CalendarView sender, CalendarViewSelectedDatesChangedEventArgs args)
{
try
{
TaskEndDate.Date = args.AddedDates[0];
EventStartDate.Date = args.AddedDates[0];
EventEndDate.Date = args.AddedDates[0];
}
catch(System.Runtime.InteropServices.COMException)
{ }
}
2.功能栏
包括保存并退出按钮和删除按钮。各绑定一个command和一个click事件,用来完成对应功能。
3.编辑区域
由Pivot,TextBox,CalendarPicker和TimePicker组成。两个PivotItem分别对应日程页和任务页。文本框内容与后台数据双向绑定。
由于数据库搭建时报道上出了差错,导致数据类型和页面中直接得到的类型有一些微小的差错,具体来说就是页面中直接得到的时间格式是DateTimeOffset和TimeOffset,而数据库数据为单纯的DateTime,无法直接绑定,于是在本页面中进行了一些转换后写入,就使用结果来说没有任何差别。
4.人员
由于多用户系统还未编写,本模块置空等待后续使用。
MODEL
包括event和task两个model,分别对应日程和任务。二者结构大体相似,包括ID,标题,内容,时间等成员。具体留到之后由我们负责数据库部分的编译经理介绍。
VIEWMODEL
namespace CMDCalendar.ViewModels
{
public class EditPageViewModel:ViewModelBase
{
/// <summary>
/// EditPage ViewModel。
/// </summary>
private IDatabaseUtils _databaseUtils;
public RelayCommand _saveAndQuit;
public RelayCommand _deleteCommand;
public Event eventDisplay
{
get;
set;
}
public DB.Task taskDisplay
{
get;
set;
}
public RelayCommand SaveAndQuit =>
_saveAndQuit ?? (_saveAndQuit =
new RelayCommand(async () =>
{
var service = _databaseUtils;
if (eventDisplay != null)
await service.UpdateEventAsync(eventDisplay);
if (taskDisplay != null)
await service.UpdateTaskAsync(taskDisplay);
}));
public RelayCommand DeleteCommand =>
_deleteCommand ?? (_deleteCommand =
new RelayCommand(async () =>
{
var service = _databaseUtils;
if(eventDisplay != null)
await service.DeleteEventAsync(eventDisplay);
else
await service.DeleteTaskAsync(taskDisplay);
}));
public EditPageViewModel(IDatabaseUtils databaseUtils)
{
_databaseUtils = databaseUtils;
eventDisplay = new Event();
taskDisplay = new DB.Task();
}
public EditPageViewModel():this(DesignMode.DesignModeEnabled?
(DatabaseUtils)null :
new DatabaseUtils())
{ }
}
}
包括两个command,保存并退出和删除,以及两个数据结构,event和task,分别对应日程和任务。曾经尝试了很多次在数据的set和get里加入一些操作,或者在viewmodel里增加一些event,但最后都找到了更简单的解决办法,通过view内的交互就达到了想要的效果。结果就是显得viewmodel非常的简陋,但功能不受影响。
单元测试
还没做,前几天把能考虑到的的bug修完了,接下来的几天里会完成单元测试部分。