在Windows Phone中使用Local DataBase與ISolateStorage—在MVVM模式下(—)中我們已經完成了三件事情,包括:
一.建立MVVMLight的Windows Phone Project二.在Model中建立SQL CE資料庫三.建立MessageView.xaml介面以及綁定MessageViewModel
下面我們繼續添加IM功能…….
四.添加SendMessage的功能
上文我們已經設計了MessageView.xaml,並綁定了MsgViewModel,下一步我們在MessageViewModel中添加幾個屬性,分別來對應View中的輸入框和ListBox訊息列表。訊息輸入框綁定的屬性很簡單,如下,
1: private string sendmessage;
2: public string SendMessage
3: {
4: get { return sendmessage; }
5: set {
6: if(value!=null)
7: {
8: sendmessage=value;
9: RaisePropertyChanged("SendMessage");
10: }
11: }
12: }
RaisePropertyChanged("SendMessage");是用來通知binding值已經改變,是MVVMLight封裝的,與 我們UserInfoTable Class中自己實現的NotifyPropertyChanged基本一致。
1: #region NotifyPropertyChanged
2:
3: public event PropertyChangedEventHandler PropertyChanged;
4: private void NotifyPropertyChanged(string propertyname)
5: {
6: if(PropertyChanged!=null)
7: {
8: PropertyChanged(this,new PropertyChangedEventArgs(propertyname));
9:
10: }
11:
12: }
13: #endregion
至於綁定ListBox的源,我們要使用ObservableCollection<UserInfoTable> ,這裡之所以不使用List<UserInfoTable>或者IEnumerable<UserInfoTable>,是因為在綁定ListBox時如果我們ItemSource改變了或者重新執行個體化後,List或者IEnumerable可以實現ListBox重新整理,但是如果僅僅ListBox中的一個Item發生改變,這時候List就不能滿足要求了,有人說UserTable不是實現INotifyPropertyChanged,INotifyPropertyChanging,作為Item的UserTable改變時是可以重新整理ListBox的,嗯,這點是對的,但是如果List/IEnumerable添加值或者刪除值的時候,Listbox是得不到更新的通知的。
這時候我們就要用到ObservableCollection了,當然Item也要實現INotifyPropertyChanged等介面才可以。看下面代碼:
1: private ObservableCollection<UserInfoTable> userTable=new ObservableCollection<UserInfoTable>();
2:
3: public ObservableCollection<UserInfoTable> UserTable
4: {
5: get{return this.userTable; }
6: set {
7: if (value != null)
8: {
9: userTable = value;
10: RaisePropertyChanged("UserTable");
11: }
12: }
13: }
還有一個注意的問題,RaisePropertyChanged("UserTable")中的UserTable不要錯寫成usertable即不要寫成欄位,否則會引起調試失敗。
這時候我們就可以為我們的Send Message按鈕添加Command了。在MessageViewModel中建立
1: publicICommandSendMessageCommand{get;privateset;}
註:WPF中實現MVVM模式Command是立下了汗馬功勞。當然ICommand要引用using System.Windows.Input命名空間。
然後在MessageViewModel的建構函式中註冊SendMessageCommand的Execute事件。首先引用命名空間
using GalaSoft.MvvmLight.Command;我們需要用到其中的RelayCommand,以及lamda運算式(當然,在其中使用函數調用也可以)。代碼如下所示:
1:
2: SendMessageCommand = new RelayCommand(
3: ()=>{
4: UserInfoTable userinfo = new UserInfoTable();
5: userinfo.UserId = 1;
6: userinfo.UserNameAndTime = "Haisa";
7: userinfo.UserMessage = sendmessage;
8: userTable.Add(userinfo);
9: haisaDataContext.HaisaTable.InsertOnSubmit(userinfo);
10: haisaDataContext.SubmitChanges();
11: }
12: );
現在我們在ViewModel中已經定義了Command,然後使用Blend綁定Send Message按鈕和SendMessageCommand,如示,拖動Behaviours中的InvokeCommandAction拖動到Send Message按鈕上,然後在右側屬性視窗上設定InvokeCommandAction的屬性進行設定:
如,該程式我們只需要設定EventName為Click即可。
OK,到這裡我們已經設定好SendMessage按鈕的響應事件了,我們接著看SendMessageCommand的Execute事件。我們執行個體化了一個
UserInfoTable Class,然後使 userinfo.UserMessage = sendmessag,然後Add至ObservableCollection,這時候就可以在ListBox中更新已發送的訊息,我們還想將發送的Message儲存為記錄,即每次開啟程式可以查看記錄的內容,這時候便要使用本機資料庫了。 在建構函式中執行個體化haisaDataContext = new HaisaDataContext(HaisaDataContext.DBConnectionString);然後在SendMessageCommand中就可使用Linq進行資料庫Insert:
1: haisaDataContext.HaisaTable.InsertOnSubmit(userinfo);
2: haisaDataContext.SubmitChanges();
注意一定要使用SubmitChanges函數才能真正的執行資料庫寫入操作。 當然這隻是簡單的類比Send Message,過段時間我會使用Socket實現真正的往伺服器端發送Message。^_^
我們還希望能查看發送Message的記錄,這時候為ApplicationBarIconButton添加Click事件,在事件中加入導航至MessageHistoryView的代碼,ApplicationBarIconButton貌似沒法綁定Command,我們就直接在BehindCode中添加事件如下了:
1: this.NavigationService.Navigate(new Uri("/View/MessageView.xaml", UriKind.RelativeOrAbsolute));
五.添加MessageHistoryView的頁面功能
MessageHistoryView中只添加一個ListBox和一個返回SendMessageView的ApplicationBarIconButton。MessageHistoryView中綁定ListBox的方式與MessageView中類似,只不過Command的執行代碼改成讀取Local DataBase SQL CE了。
如下所示:
1: ShowMessageHistoryCommand=new RelayCommand(
2: ()=>{
3:
4: IEnumerable<UserInfoTable> users=from p in haisaDataContext.HaisaTable select p;
5: userTable = new ObservableCollection<UserInfoTable>(users);
6:
7: }
8: );
因為每個View綁定ViewModel的時候,都會執行個體化一個ViewModel類,所以此時多個View綁定同一個ViewModel是不會相互影響的,因為真正綁定的其實是ViewModel的多個執行個體。
這時候準系統已經實現,但是使用者體驗真的好嗎?我們知道Windows Phone是有墓碑機制的,假使沒有針對墓碑機製做一些處理,使用者體驗是相當糟糕的,下一篇開始講解。
六.完善使用者體驗
Coming Soon…….