我有一个MVVM C#项目,我在打开MainViewModel时启动了void,并开始从Web解析数据,并将每个项目添加到名为foundItemsList的BindableCollection中。
我想在主ViewModel和我名为AddItemViewModel的第二个ViewModel之间添加该列表的实时源。
这是如何实现的,因为当我尝试发送数据时,它只会在我点击按钮打开AddItemViewModel时发送列表的数据,并且在我打开之后不会考虑找到的任何项目AddItemViewModel。
答案 0 :(得分:1)
有Event Aggregator
和Mediator
模式在希望提供ViewModels
MVVM
之间的通信时很常见。这些基本上提供了Publish
和Subscribe
机制,以便在ViewModels
之间传递数据。
或者,您可以拥有ViewModel
和MainViewModel
派生的父AddItemViewModel
,并实现BindableCollection
周围的功能。
另一种方法是在event
中MainViewModel
AddItemViewModel
subscribe
公开BindableCollection
,以便在MainViewModel
AddItemViewModel
时通知MainViewModel
{1}}更改。这意味着让{{1}}了解{{1}}可能会或可能不会为您接受。{/ p>
答案 1 :(得分:1)
我真正建议您实现此类逻辑的方法是在应用程序中添加一些服务部分。 该服务必须负责与数据操作相关的任何操作(意思是业务逻辑的数据)。因此,如果您需要从服务器(或任何其他数据更改)获取某些内容 - 您调用服务的某些方法,例如“GiveMeTheData()”(它也可以是 Asyncronous )。 / p>
这将允许您分离代码部分的职责(除了更简单的代码阅读),这将使您更容易测试不同的部分。
因此,至于处理要更新的两个ViewModel - 通常你只是订阅类似'OnNewDataArriving'事件的事件,每个ViewModel订阅你的服务(在他们的初始化时)。 但这是一个概念性的解释。
谈论现实生活 - 不同的方法可以做到这一点(同样,依赖于你用来管理MVVM的框架(如果你还没有,你真的应该考虑那个))
所以:
如果你使用 MvvmCross 之类的东西,你可以对通过应用程序发送的某些消息使用subscribe:在我们的例子中,服务器会发送类似“一些新数据”的内容一些特定数据类型已经到达“消息,并且每个ViewModel(如果订阅了该类型的消息)将被通知并相应地更改其内容。
或者,您可以使用 Rx (Reactive Extensions) 实现所有逻辑:您只需定义一些IObservable集合(作为您需要的每个ViewModel的数据源)(该集合)也应该位于您的服务中(如果不在服务中,仍然必须有类似“存储库”的内容,其中包括这些集合(以及一般数据)。