这是在WPF中实现MVVM应用程序的好方法吗?

时间:2011-07-01 13:12:03

标签: wpf mvvm

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

BuddyListModel

ChatSessionModel

ChatMessageModel

以下ViewModels:

BuddyListViewModel

ChatSessionsViewModel

ChatMessagesViewModel

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

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

但它确实取决于应用程序。如果以这种方式接近它,就有可能会出现一条消息,即没有任何处理,它将被丢弃。那可以吗?

答案 1 :(得分:0)

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

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