多个ViewModel之间的数据共享

3
参考我的问题如何绑定来自多个模型的Bing Pushpin?,我对这方面还不是很熟悉,虽然我在网上搜索了很多方法,但MVVM的方法似乎有太多不同的方法,再加上WP7,我有点困惑。
现在,我正在努力找出共享ViewModel之间数据的最佳方式,甚至不确定这是否是最佳方法。
我的模型:PeopleModel,BuildingModel 我的ViewModel:PeopleViewModel,BuildingViewModel(其中包含模型的Observable集合)
目前,一个定时器用于从Web服务更新列表。由于它是静态的,因此可以在应用程序的生命周期内进行更新。但我不确定这是否是最明智的方法,但我需要一些后台同步以满足要求。
People和Building包含一个位置,但没有关于应在pushpin上显示哪个图像的任何信息。所以我想如果我有一个包含与ViewModels某种方式链接的MapViewModel的地图视图,但我不知道怎么做。
我看过MVVMLight,似乎可以在启动时注册ViewModels,因此可以添加其他ViewModels的链接,而不用担心它们的生命周期?
但是,考虑到在Models中有额外的信息,该Map不感兴趣,我想是否最好拥有一个自我包含的MapViewModel,其中包含某种类型的自定义pushpins列表(如PeoplePushpins,BuildingPushpins)。如果我采用这种方法,我想知道如何从其他Models中更新MapViewModel。
我的意思是PersonViewModel中正在运行的定时器检测到列表中的更改,因此更新其自己的列表。我需要向Map发送通知,告知其有更新,然后将自己从其中更新。

你能否不要在问题标题前加标签?你的问题已经有了WP7标签。标签在这里非常有效;在标题中放置冗余标签并不能帮助你得到答案。你能不能为我好好做一下,不要这样做呢? - user1228
好的,我没有意识到。谢谢你的建议。 - Firedragon
1个回答

2
使用MVVMLight,您可以使用消息传递在模型之间发送数据:
//build class to send as message  
public class AddPushPinMessage
{
    public PushPin PushPin { get; set; }
}

public class ReceivingViewModel
{
  public ReceivingViewModel()
  {
     Messenger.Default.Register<AddPushPinMessage>(this, (m) => AddPushPin(m));
  }

  void AddPushPin(AddPushPinMessage msg)
  {
     //handle message
  }
}

public class SendingViewModel
{
  private object SendPushPin(PushPin key)
  { 
    Messenger.Default.Send<AddPushPinMessage>(new SetPushPinMessage() { PushPin = key });

    return null;
  }
}

这看起来非常像我正在寻找的东西。我已经阅读了有关消息传递的内容,但是像这样的示例总是很有用的。发现可以通过引发属性更改来发送带有其旧值和当前值的对象,例如RaisePropertyChanged("StringOne", oldValue, value, true);,这也可能对我有用。希望以这种方式发送数据不会太过于繁琐。 - Firedragon
我认为你不应该过度使用发布和订阅,虽然我从未遇到过任何性能问题,但我尽量在 Windows Phone 应用程序上保持低调。当你使用这种消息传递方式时,请确保在正确的时间创建视图模型,否则你的消息将无法到达。 - Didier Caron
我的目标是在遵循最佳实践的情况下,找出在WP7中可能存在的问题。如果某个过程无法正常工作,我可以寻找替代方案。感谢您的建议。 - Firedragon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接