1

我有一个 MVVM C#​​ 项目,当打开 MainViewModel 并开始解析来自 Web 的数据并将每个项目添加到名为 foundItemsList 的 BindableCollection 中时,我启动了一个 void。

我想要主 ViewModel 和我命名为 AddItemViewModel 的第二个 ViewModel 之间的该列表的实时提要。

这是如何实现的,因为当我尝试发送数据时,它只会发送列表的数据,当我单击按钮打开 AddItemViewModel 时,不会考虑打开 AddItemViewModel 后找到的任何项目。

4

2 回答 2

1

当要提供 in 之间的通信时,有Event Aggregator和模式很常见。这些本质上提供了一种和机制在.MediatorViewModelsMVVMPublishSubscribeViewModels

或者,您可以有一个ViewModel您的父级,MainViewModel并从该父AddItemViewModel级派生,并实现围绕您的BindableCollection.

另一种选择是公开一个eventin your MainViewModelthat the AddItemViewModelcan subscribe,以便在BindableCollectioninMainViewModel更改时得到通知。这将意味着让您AddItemViewModel知道MainViewModel哪些内容可能适合您,也可能不适合您。

于 2013-11-10T20:23:32.877 回答
1

我真正建议您实现这种逻辑的方式是在您的应用程序中添加一些服务部分。服务必须负责与数据操作(即业务逻辑的数据)相关的任何操作。因此,如果您需要从服务器获取一些东西(或任何其他数据更改)——您调用服务的某些方法,例如“GiveMeTheData()”(它也可以是 Asyncronous

这将允许您解耦代码部分的责任(除了更容易阅读代码之外),这将使您能够更轻松地测试不同部分。


因此,至于处理两个要更新的 ViewModel - 通常您只需订阅类似“OnNewDataArriving”事件,每个 ViewModel 都订阅您的服务(在它们的初始化时)。但这是一个概念性的解释。

说到现实生活中的实现——可能有不同的方法(也取决于你用来管理 MVVM 的框架(如果你仍然不这样做,你真的应该考虑这一点))。

所以:

  • 如果您使用MvvmCross 之类的东西,您可以对通过应用程序发送的某些消息使用订阅:在我们的例子中,服务器将发送类似“某些特定数据类型的一些新数据已到达”的消息,以及每个 ViewModel(如果订阅该类型的消息)将被通知并相应地更改其内容。

  • 或者,您可以使用Rx (Reactive Extensions)来实现所有这些逻辑:您只需定义一些 IObservable 集合(作为您需要的每个 ViewModel 的数据源)(该集合也应该位于您的服务中(如果不在服务中) ,仍然必须有类似“存储库”的东西,其中包括这些集合(和一般的数据)。

于 2013-11-10T20:42:56.560 回答