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

这是在WPF中实现MVVM应用程序的好方法吗?,wpf,mvvm,Wpf,Mvvm,我是WPF的新手。我正在尝试使用Jabber.NET实现一个聊天应用程序,我希望遵循正确的MVVM架构。我有以下型号: BuddyListModel 聊天会话模型 聊天信息模型 以下视图模型: BuddyListViewModel ChatSessionViewModel chatmesssviewmodel 每个虚拟机都包含相应模型的可观察集合 我在BuddyListViewModel中实例化Jabber(我在其中放置了登录处理),所有事件处理程序(状态、新消息)都在该VM中;问题是,以这种方

我是WPF的新手。我正在尝试使用Jabber.NET实现一个聊天应用程序,我希望遵循正确的MVVM架构。我有以下型号:

BuddyListModel

聊天会话模型

聊天信息模型

以下视图模型:

BuddyListViewModel

ChatSessionViewModel

chatmesssviewmodel

每个虚拟机都包含相应模型的
可观察集合

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


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

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

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

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

但这实际上取决于应用程序。如果您以这种方式进行处理,则有可能会收到一条消息,该消息未被处理,并且会被丢弃。可以吗?

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


的示例应用程序展示了如何将控制器与MVVM一起使用。

非常感谢您的有用建议!