2011-07-01 37 views
0

我对WPF比较陌生,所以我的问题可能会令人困惑... 我试图使用Jabber.NET实现一个聊天应用程序,我想遵循正确的MVVM架构。 其实我有以下型号: BuddyListModel这是一种在WPF中实现MVVM应用程序的好方法吗?

ChatSessionModel

ChatMessageModel

以下的ViewModels:

BuddyListViewModel

ChatSessionsViewModel

ChatMessagesViewModel

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

我在BuddyListViewModel(我已经把登录处理)和所有的事件处理程序(状态,新消息)instanciate Jabber在该虚拟机;问题在于,通过这种方式,我必须从BuddyListViewModel调用其他VM方法(AddNewChatSession,当新消息到达时,....),我不知道这是否是MVVM的正确方法。

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

在此先感谢您的建议!

回答

1

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

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

我不会把所有聊天消息放在一个集合中,然后让会话视图模型过滤它们 - 过滤集合中的项目是O(n)操作,如果您正在构建聊天客户端, n会变得非常大。如果聊天会话属于会话,它将进入并捕获它,这更符合逻辑。

但它确实取决于应用程序。如果以这种方式来解决问题,那么可能会出现一则消息,说明什么都没有处理,并且会被丢弃。这可以吗?

+0

非常感谢您的有用建议! – Cris

0

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

WPF Application Framework (WAF)样本应用程序展示如何控制器可以与MVVM使用。

相关问题