2012-12-17 38 views
2

我正在创建一个聊天应用程序,它也具有文件传输功能。我正在尝试使用Prism的MVVM模式进行设计。保持模型与视图模型同步

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

在我的应用程序中,我为程序的每个不同区域,消息区域,具有用户列表的区域以及用户输入消息的区域提供了不同的视图和视图模型。视图对视图模型一无所知,而视图模型对视图一无所知。视图模型非常简单,几乎没有逻辑。

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

我遇到的问题是如何清洁地保持视图模型ObservableCollections与包含在模型中的列表保持最新。例如,在模型中,我有一个关联用户列表。无论何时该列表发生更改(例如用户连接或断开连接时),我需要更新处理用户列表的视图模型中的用户的ObservableCollection。

我想我需要完成这个的方式是使用事件。因此,无论何时用户连接,只要用户断开连接,我都会创建在模型中触发的事件。当然,当服务器向所有用户发送消息以及模型实际执行的所有其他事情时,我也必须有事件。

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

我越试图构建这个应用程序,它就越容易让我感到困惑。现在我的控制器在其所拥有的方法数量上非常庞大,我甚至还没有开始添加我想要的所有聊天程序的功能。

回答

0

我认为整个问题的多余的倒数第二个段落:)

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

+1

让我们假装模型不是我自己创建的。我将如何去保持模型中的List与我的viewmodel中的ObservableCOllection同步? 如果模型有事件,并且没有。我是否必须在我的控制器中定期主动轮询模型,并在信息模型更改后将信息传递给我的视图模型? – Cowman

+0

这将是犯规。列表本身并没有属性更改通知和事件,所以如果你拥有的是List,那么你必须周期性地迭代List中的所有元素和OC中的所有元素并手动同步 - 因为当你在枚举过程中,您不能删除任何项目,因此必须制作单独的缓冲区列表以备日后处理。必须分别为每个清单<-> OC关系做好准备。如果您添加了每个项目的模型提升事件,那么它变得更容易。但为什么? –

+0

我想你是绝对正确的。我应该改变我的模型,并停止尝试以这种钝的方式去做事。我仍然在学习所有这些,所以我认为这是一个简单的方法,而不是一个学习如何做事的好方法,但我猜如果它有效的话,它就会起作用。 谢谢你的回答。 – Cowman

相关问题