0

好的,所以我正在使用 MVCVM(或 MVCVM)模式在 WPF 中使用 Microsoft Prism。

在我的 ChatModule 中,我有一系列视图、视图模型和一个控制器。

对于我的意见

  • ChatAreaView - 显示进来阅读的聊天消息。它托管在 TabControl 区域内,因此我可以在用户和其他用户之间建立聊天窗口,或者文件传输窗口等。
  • UserAreaView - 这是用户列表。右键单击有上下文菜单可以与它们交互......比如发送文件或耳语。
  • MessageAreaView - 这是用户键入要发送给所有其他人的消息的地方。

对于每个视图,我都有一个对应的 ViewModel。ChatAreaViewModel、UserAreaViewModel 和 MessageAreaViewModel。这些 ViewModel 本质上只包含属性。

例如,UserAreaViewModel 定义了一个用户类型的结构,它本质上只是一个名称。实际上这是在类之外定义的,但仍然......它使用它。它有一个 ObservableCollection 来存储当前连接的所有用户的列表。它还定义了与用户交互的 ICommand 属性。现在我有 SendFile、Whisper 和 Nudge... 打算在未来添加更多。

控制器创建这些视图和 ViewModel,并将它们结合起来。它通知它们,将 ViewModel 分配为相应的 View 的 DataContext,并设置 ViewModel 的所有初始属性。在模块的整个生命周期中,它将对用户交互做出反应并执行它已分配给每个 ViewModel 的 ICommand 属性的 DelegateCommands。这些将进一步改变 ViewModel 中属性的状态。

我使用的是 Views 和 ViewModels 的实际类型,而不是像这样的接口。

#region Views

ChatAreaView viewChatArea;
UserListView viewUserArea;
MessageView viewMessageArea;
LoginPromptView viewLoginPrompt;

#endregion

#region ViewModels

ChatAreaViewModel viewModelChatArea;
UserAreaViewModel viewModelUserArea;
MessageAreaViewModel viewModelMessageArea;
LoginPromptViewModel viewModelLoginPrompt;

#endregion

如果我为 Views 和 ViewModels 定义接口,并在控制器中对这些接口而不是具体实现进行操作,事情会变得更整洁、耦合更少吗?然后我可以在 Module 类(本质上是每个模块的根)中将它们注册到我的 Container 中吗?

我这样做有什么好处?我将如何为每个视图实现一个接口以将它们与其他视图区分开来?除了拥有 XAML 之外,他们并没有真正做任何事情……而且 ViewModel 也没有真正做任何事情,除了具有某些属性。这些属性可能会发生变化。例如,在 UserAreaViewModel 上,我肯定想添加更多命令,以便用户可以以不同的方式与另一个用户交互。

有人可以帮我吗?在我的脑海中,我在想我应该抽象出这些东西,但我真的不知道我应该以一种合乎逻辑的方式来处理它,或者即使这样做是一个明智的主意。我有什么收获?

感谢您的时间。下图是我正在处理的示例。忽略 Add new Item 按钮和所有内容的样式......这不是我现在正在做的事情。

聊天应用

4

1 回答 1

0
  1. 松耦合——将来可以用完全不同的实现来替换整个类。
  2. 独立开发.. 可以注入一个虚拟 UI / 视图,直到最终 UI 准备好。两部分可以同时进化(在有一个共同的合同之后)。
  3. 无需添加对模块的引用(实现视图)。可以使用 ConfigurationModuleCatalog 从配置文件中发现类型。
于 2012-09-22T04:29:38.583 回答