Windows Phone中使用Local DataBase與ISolateStorage—在MVVM模式下(二)

來源:互聯網
上載者:User

    在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…….

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.