我对WPF很新。我正在尝试使用Jabber.NET实现聊天应用程序,我想遵循正确的MVVM架构。我有以下型号:
BuddyListModel
ChatSessionModel
ChatMessageModel
以下ViewModels:
BuddyListViewModel
ChatSessionsViewModel
ChatMessagesViewModel
每个VM都包含ObservableCollection<>
个相应的模型。
我在BuddyListViewModel(我已经放置了登录处理)中实现了Jabber,并且所有事件处理程序(在线状态,新消息)都在该VM中;问题是,这样做,我必须从BuddyListViewModel调用其他VMs方法(新消息到达时的AddNewChatSession,....),我不知道这是否是MVVM的正确方法。
另一个问题是我正在处理单个ViewModel中的所有消息,并认为使用过滤器(例如,在linq中)在相应的ChatSession中显示消息。这是好事吗?
答案 0 :(得分:1)
我创建一个ApplicationViewModel
来保存主模型的实例(可能是Jabber对象),并将实例传递给它实例化的其他虚拟机,以便它们可以注册以处理模型的事件加注。 (我假设,根据您的描述,当Jabber收到消息时,它会引发一个事件并在EventArgs
中传递消息。)
如果您这样做,那么当新邮件到达时,您的ChatSessionsViewModel
可以检查它是否在新会话中,如果是,则创建新的ChatSessionViewModel
。您的ChatSessionViewModel
可以检查消息以查看它是否属于会话,如果是,则将其添加到其消息集合中。这两个操作完全相互独立。
我不会将所有聊天消息放在一个集合中,然后让会话视图模型过滤它们 - 过滤集合中的项目是O(n)操作,如果您正在构建聊天客户端,n会变得非常大。让聊天会话检查消息并将其捕获(如果它属于会话)更合乎逻辑。
但它确实取决于应用程序。如果以这种方式接近它,就有可能会出现一条消息,即没有任何处理,它将被丢弃。那可以吗?
答案 1 :(得分:0)
您可以将Controllers与MVVM模式一起使用。它们在ViewModel之间进行调解,因此可以在其他ViewModel上调用方法。
WPF Application Framework (WAF) 的示例应用程序展示了控制器如何与MVVM一起使用。