【问题标题】:Is it right to share ObservableCollection for messages in a chat app?在聊天应用中为消息共享 ObservableCollection 是否正确?
【发布时间】:2011-06-29 12:48:25
【问题描述】:

我正在使用 WPF 构建一个聊天应用程序,并试图了解实现它的最佳方法。
我的 ViewModel 中有一个“接收”事件,当消息到达时,我想将其添加到包含所有发送和到达聊天会话的消息的 ObservableCollection<Message>

当消息来自新用户时,我必须打开一个新的聊天窗口,如果消息来自已创建窗口的用户,我必须添加消息。

为所有消息拥有一个唯一的 ObservableCollection 是一件好事吗?如果是这样,我如何通知视图新用户的消息已到达?以及如何为用户数据绑定消息的集合添加“过滤器”?

【问题讨论】:

    标签: wpf messaging


    【解决方案1】:

    如果您将项目添加到 ObservableCollection 并且您在视图中的控件(无论是任何网格/列表视图)应该在绑定到它时自动更新自身。但这意味着您需要为每个新用户拥有新的聊天集合。如果您的数据检索不在 GUI 线程,请确保您已处理所有线程问题。

    我会仔细考虑如何设计这个:

    • 您是否有兴趣保留/保存您的聊天记录?

    • 您可以使用其他消息传输方式,例如 Solace 吗?

    【讨论】:

      【解决方案2】:

      我认为你是在正确的轨道上。这是您可以采取的一种方法:

      坚持使用 MVVM 模式,您的模型将监听新消息。它可以维护当前视图/视图模型和用户对的列表。如果消息来自新用户,则创建一个新视图及其对应的视图模型,然后只需将消息添加到视图模型中的 ObservableCollection。因为 ObservableCollection 实现了INotifyCollectionChanged interface,所以您绑定到它的任何 UI 元素都会在新项目添加到集合中时自动收到通知,然后应该显示它。

      如果您想变得非常棘手和超级高效,您可以拥有一个所有单个视图都绑定到的视图模型,并且它们可以使用过滤机制来隔离出它们应该显示的正确消息(提示:使用值转换器绑定到 ObservableCollection)。这样做意味着您只维护一个视图模型和一个 ObservableCollection,并且减少了您需要跟踪的项目数量。

      【讨论】:

      • 是的,坏事是我想在 TabControl 内为聊天会话创建新的 TabItems 但有这个问题:stackoverflow.com/questions/6509264/… 并且似乎我无法正确使用 TextBox 作为单个 TabItem 内的内容这样我就不会使用数据绑定来动态创建 TabItems,而是在代码隐藏中创建它们。所以我不知道如何让 VM 通知 View ObservableCollection 已更改。
      • @Cris - VM 不需要做任何事情,ObservableCollection 会通知任何事情,它的集合已经改变,不需要你做进一步的工作。您还可以在标签页内使用ItemsControl 来显示您的消息。
      猜你喜欢
      • 2019-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-30
      • 1970-01-01
      • 2022-12-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多