2011-06-29 42 views
0

我正在建立一個使用WPF的聊天應用程序,我試圖理解哪個是實現它的最好方法。 我在我的ViewModel中有一個「接收」事件,當消息到達時,我想將它添加到ObservableCollection中,該消息包含發送和到達聊天會話的所有消息。在聊天應用程序中分享ObservableCollection消息是否正確?

當消息從新用戶到達時,我應該打開一個新的聊天窗口,並且如果消息從已創建窗口的用戶到達,我必須添加消息。

爲所有消息設置獨特的ObservableCollection是否是件好事?如果是這樣,我如何通知視圖,消息已經到達新用戶?我怎麼能把一個「過濾器」的數據綁定到用戶的消息的集合?

回答

1

如果您將項目添加到ObservableCollection,並且您的控件在視圖中(無論它是grid/listView)應該在綁定到它時自動更新。但這意味着您需要爲每個新用戶添加新的聊天收藏。如果數據檢索不在GUI線程中,請確保處理了所有線程問題。

我會仔細思考我會怎麼設計這個:

  • 您是否有興趣在持續/保存您的聊天記錄?

  • 你可以使用Solace等其他消息傳輸嗎?

1

我認爲你是在正確的軌道上。以下是您可以採用的一種方法:

堅持使用MVVM模式,您的模型將會偵聽新消息。它可以維護當前視圖/視圖模型和用戶對的列表。如果消息從新用戶到達,請創建一個新視圖&其對應的視圖模型,然後將消息添加到視圖模型中的ObservableCollection。因爲ObservableCollection實現了INotifyCollectionChanged interface,所以綁定到它的任何UI元素都會在新項目添加到集合後自動得到通知,然後顯示它。

如果你想變得非常棘手和超高效,你可以有一個視圖模型,所有單獨的視圖都是綁定的,他們可以使用過濾機制隔離出他們應該顯示的正確信息(提示:使用一個綁定到ObservableCollection的值轉換器)。這樣做意味着您只能維護一個視圖模型和一個ObservableCollection,並且它會減少需要跟蹤的項目數量。

+0

是的,不好的一點是,我想在TabControl中爲聊天會話創建新的TabItems,但有這個問題:http://stackoverflow.com/questions/6509264/wpf-weird-problem-in-databinding- with-tabcontrol,似乎我不能正確使用TextBox作爲單個TabItem內的內容,以便我不使用數據綁定動態創建TabItems,並在代碼隱藏中創建它們。所以我不知道如何讓VM通知視圖ObservableCollection已更改。 – Cris

+0

@Cris - 虛擬機不需要做任何事情,ObservableCollection通知它它的集合發生了變化,你不需要進一步的工作。您也可以使用標籤頁內的[ItemsControl](http://msdn.microsoft.com/en-us/library/system.windows.controls.itemscontrol.aspx)來顯示您的消息。 – slugster