wpf - 保持模型与 View 模型同步

标签 wpf mvvm model viewmodel

我正在创建一个聊天应用程序,它也将具有文件传输功能。我正在尝试使用 Prism 的 MVVM 模式来设计它。

我对这个应用程序的模型,或者至少这个模块(应用程序此时只有一个模块,并且它可能是唯一的模块),是一个 ChatManager 类,负责托管服务器、加入服务器和持有聊天 session 的所有状态信息。它可能是连接到另一台服务器的客户端,也可能既是客户端又是服务器,因为主持聊天的任何人也将是他自己的服务器的客户端。

在我的应用程序中,对于程序的每个不同区域、消息区域、具有用户列表的区域以及用户键入消息的区域,我都有不同的 View 和 View 模型。 View 对 View 模型一无所知, View 模型对 View 一无所知。 View 模型非常简单,几乎不包含任何逻辑。

所有逻辑都在我的 ChatController 类中,该类基本上控制应用程序的流程。它负责创建所有 View 、所有模型、分配适当的 View 模型作为 View 的数据上下文,并在适当的时间将每个 View 注入(inject) shell。它还负责将实际数据从模型分配给 View 模型。

我遇到的问题是如何使 View 模型 ObservableCollections 与模型中包含的列表保持同步。例如,在模型中我有一个已连接用户的列表。每当该列表发生变化时,例如当用户连接或断开连接时,我需要在处理用户列表的 View 模型中更新用户的 ObservableCollection。

我认为我需要使用事件来完成此任务。所以我创建了在用户连接时在模型中触发的事件,只要用户断开连接。当然,当服务器向所有用户发送消息以及模型实际执行的所有其他操作时,我也必须有事件。

我想我的问题是,这样做是不是一个好方法?我是否应该将模型的用户集合更改为 ObservableCollection 并完全避免事件,只需将 View 模型的集合分配给模型集合?

我越是尝试构建这个应用程序,它就越让我感到困惑。现在我的 Controller 拥有的方法数量非常多,我什至还没有开始添加我想要的聊天程序的所有功能。

最佳答案

我认为整个问题都是多余的,因为最后一段 :)

ObservableCollection 是 System.Collections.ObjectModel 的一部分。它与任何特定的 UI 技术无关,所以我认为没有必要将它限制在 View 模型中,而不是将其置于核心并替换您的列表。

关于wpf - 保持模型与 View 模型同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13920212/

相关文章:

WPF : TextBox binding not working after using DataTemplateSelector/ContentTemplateSelector

c# - 如何在更新属性时调用代码隐藏中的方法?

c# - 需要帮助将 C#/WPF 中的阻塞操作转换为线程操作

c# - WPF 可重用 Style.Triggers

c# - WPF 在 XAML 中添加带有变音符号的 KeyBinding 事件

.net - ListBox 和 ListView 突出显示 .NET 4.0

c# - 在一个组合框中显示数据库中的多列

ruby-on-rails - Rails_admin 新模型配置

ruby-on-rails - Rails 2 中现有表的模型

yii - 如何在 Yii2 中将变量传递给模型?