【问题标题】:Is it a good way to realize a MVVM app in WPF?这是在 WPF 中实现 MVVM 应用程序的好方法吗?
【发布时间】:2011-07-01 13:12:03
【问题描述】:

我对 WPF 比较陌生。我正在尝试使用 Jabber.NET 实现聊天应用程序,并且我想遵循正确的 MVVM 架构。我有以下型号:

好友列表模型

聊天会话模型

聊天消息模型

以下 ViewModel:

好友列表视图模型

ChatSessionsViewModel

ChatMessagesViewModel

每个 VM 都包含 ObservableCollection<> 的对应模型。

我在 BuddyListViewModel 中实例化 Jabber(我在其中放置了登录处理),并且所有事件处理程序(存在、新消息)都在该 VM 中;问题是,这样做,我必须从 BuddyListViewModel 调用其他 VM 方法(新消息到达时的 AddNewChatSession,......),我不知道这是否是 MVVM 的正确方法。

另一个问题是我在单个 ViewModel 中处理所有消息,并考虑使用过滤器(例如在 linq 中)在相应的 ChatSession 中显示消息。是好事吗?

【问题讨论】:

    标签: wpf mvvm


    【解决方案1】:

    我会创建一个 ApplicationViewModel 来保存主模型的实例(可能是 Jabber 对象),并将该实例传递给它实例化的其他 VM,以便它们可以注册以处理模型引发的事件。 (根据您的描述,我假设 Jabber 收到消息时会引发事件并在 EventArgs 中传递消息。)

    如果您这样做,那么当新消息到达时,您的ChatSessionsViewModel 可以检查它是否在新会话中,如果是,则创建一个新的ChatSessionViewModel。您的ChatSessionViewModel 可以检查消息以查看它是否属于会话,如果属于,则将其添加到其消息集合中。这两个操作完全相互独立。

    我不会将所有聊天消息放在一个集合中,然后让会话视图模型过滤它们 - 过滤集合中的项目是一个 O(n) 操作,如果你正在构建一个聊天客户端,n会变得很大。让聊天会话在消息进入时对其进行检查并在消息属于会话时对其进行捕获更为合乎逻辑。

    但这真的取决于应用程序。如果您以这种方式处理它,则可能会收到一条消息,但没有任何处理,并且它会被丢弃。可以吗?

    【讨论】:

    • 非常感谢您的有用建议!
    【解决方案2】:

    您可以将Controllers 与 MVVM 模式一起使用。它们在 ViewModel 之间进行调解,因此它们可以调用其他 ViewModel 上的方法。

    WPF Application Framework (WAF) 的示例应用程序展示了控制器如何与 MVVM 一起使用。

    【讨论】:

      猜你喜欢
      • 2018-04-13
      • 2012-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-28
      • 1970-01-01
      • 1970-01-01
      • 2012-02-21
      相关资源
      最近更新 更多