WP7有约(三):课堂重点
[2] WP7有约(三):课堂重点
[3] WP7有约(三):课堂重点
[4] WP7有约(三):课堂重点
[5] WP7有约(三):课堂重点
[6] WP7有约(三):课堂重点
我们知道,NewOrEditNotePage页的入口点有两个,而且都在NoteBookPage页上,一个是Application Bar上的新建按钮,另一个是上下文菜单里的编辑菜单项。当用户单击新建按钮时,我们需要告诉NewOrEditNotePage页当前的课程是什么,但是,我们从哪里获取这个信息?办法有很多种,其中一种是在NoteBookViewModel类里创建一个SelectedNoteList属性:
代码 28
并把它绑到Pivot控件的SelectedItem属性:
代码 29
然后在新建按钮的事件处理程序里通过SelectedNoteList的Header属性获取课程名称:
代码 30
当用户单击编辑菜单项时,我们需要告诉NewOrEditNotePage页笔记的Id是什么。我们知道,上下文菜单是嵌在列表项里的,这意味着它能从列表项那里继承DataContext属性的值,而这个值正是当前选中的笔记,所以我们可以通过菜单项的DataContext属性获取笔记的Id:
代码 31
类似地,删除操作也是通过相同的方式获取当前选中的笔记,然后把它删除:
代码 32
好了,不知不觉又到看效果的时候了!打开笔记本:
图 32
单击新建按钮:
图 33
输入笔记内容和笔记标签,然后单击确定返回:
图 34
接着,长按笔记打开上下文菜单:
图 35
选择编辑:
图 36
嗯?我刚才没有输入标签?还是我现在眼花看错?为什么标签没有保存?现在,重新输入标签,单击页面上的空白处,单击确定返回,然后再次编辑笔记:
图 37
哈!这次有了!怎么回事?!
这个时候,我的脑子里突然蹦出一个问题,当TextBox处于编辑状态时,单击确定按钮会不会触发TextBox的LostFocus事件?为了回答这个问题,我做了一个试验,结果发现,当TextBox处于编辑状态时,单击页面上的按钮或者空白处都能触发TextBox的LostFocus事件,而单击Application Bar上的按钮却不会,在这种情况下,TextBox的内容不会提交!这个问题不难解决,我们只需在调用Submit方法之前让TextBox失去焦点就行了,要实现这个效果,最简单的办法是让页面获得焦点:
代码 33
这等效于单击页面上的空白处。不幸的是,这个办法只在新建笔记时有效,我不知道为什么,看来我们只能走别的路子了。在Silverlight里,TextBox的Text属性在两种情况下会更新绑定源,第一种情况我们刚才试过了,结果你也知道了,第二种是手动更新,这里的手动更新并不是指把数据从Text属性手动复制到Note对象的对应属性,而是告诉Text属性的绑定表达式把当前数据更新回绑定源。我们知道,当用户单击Application Bar上的确定按钮时,最多只有一个TextBox获得焦点,其它TextBox会因为失去焦点自动更新,因而没有必要对每个TextBox进行手动更新。那么,如何才能得到获得焦点的控件?FocusManager类提供了一个GetFocusedElement静态方法,它返回获得焦点的控件,如果这个控件是TextBox,我们就告诉Text属性的绑定表达式把当前数据更新回绑定源:
代码 34
重新运行应用程序,这次没问题了。虽然这个问题我们自己也可以解决,但我个人认为这是系统应该考虑到的问题,即使普通按钮和Application Bar上的按钮有着本质的区别,容许这种行为上的不一致会为开发者带来不便和困惑。