【问题标题】:Keeping the model in sync with the viewmodel使模型与视图模型保持同步
【发布时间】:2012-12-04 21:44:49
【问题描述】:

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

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

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

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

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

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

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

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

【问题讨论】:

    标签: wpf mvvm model viewmodel


    【解决方案1】:

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

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

    【讨论】:

    • 让我们假设这个模型不是我自己创造的。我将如何使模型中的 List 与我的视图模型中的 ObservableCOllection 保持同步?如果模型有事件,如果没有。我是否必须在控制器中定期主动轮询模型并将信息传递给我的视图模型(如果它已更改)?
    • 会犯规的。 List 本身既没有属性更改通知也没有事件,所以如果你只有 List,那么你必须定期迭代 List 中的所有元素和 OC 中的所有元素并手动同步——因为当你'在枚举过程中,您不能删除任何项目,因此必须制作单独的缓冲区列表,以便在以后处理它们。这必须为每个 ListOC 关系单独完成。如果您为添加的每个项目添加了模型引发事件,那么它会变得更容易。但为什么呢?
    • 我想你是绝对正确的。我应该改变我的模型,停止尝试以这种迟钝的方式做事。我仍在学习所有这些,所以我的一部分认为这是一个简单的出路,而不是学习如何做事的好方法,但我想如果它有效,它就有效。谢谢你的回答。
    • 我正在阅读这个网站,了解与 ObservableCollection 一起使用的常见错误。 updatecontrols.net/doc/tips/… 它说在模型中使用 ObservableCollection 是一个错误。我猜你不这么看?
    • 我不会说我是专家或提出明确的观点,但您发布的链接是一个人的意见,没有任何理由,并且反对各种 MS 代码生成器。其中一个 cmets 提到它会破坏滚动和选择,但我从未观察到将 DataGrid 绑定到 OC。归根结底,到达某个地方的方法不止一种,而且会有不同的意见可供选择。
    猜你喜欢
    • 1970-01-01
    • 2011-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-06
    • 2012-05-13
    • 2015-12-02
    相关资源
    最近更新 更多