首先,WP8中没有这样的东西,所以您需要使用解决方法。解决方法可能不同,而链接的问题(和答案)是其中一个潜在的方法。我个人会有所不同。我将在此处描述我的当前项目架构,尽管它可能不适用于您的情况,因为我的应用程序非常大且具有复杂的结构。但是我将尝试解释如何将其应用于您的情况。
特别地,我的当前应用程序由所谓的服务(只是我的名字,不是标准名称)组成。它们具有不同的范围(某些被1页使用,某些全局应用于整个应用程序),不同的生命周期等。实质上,每个服务都是实现定义良好的接口的类,以便其他服务可以使用它。
接下来,服务可以相互依赖。我正在使用Ninject框架进行依赖注入。实质上,如果服务A依赖于服务B,则会导致以下代码:
public class B : IB
{
...
}
public class A
{
IB b;
public A(IB b)
{
this.b = b;
}
}
其中IB是一个接口,由服务B实现。
然后我有一些视图模型(是的,我正在使用MVVM,如果你想构建一个相当大的WP8应用程序,你也应该这样做)。视图模型使用服务执行应用程序功能。一些服务被多个视图模型使用。例如,我有一个服务从网上获取一些数据,并通过定期轮询保持数据最新状态。这些Web数据在应用程序的几个页面中使用,因此应该在不同的视图模型之间共享。通过依赖注入再次实现,以便所有感兴趣的视图模型都将该服务实例作为构造函数参数接受。
public class MainPageViewModel : INotifyPropertChanged
{
private string webData;
public MainPageViewModel(IWebDataService service)
{
webData = service.CurrentWebData;
service.WebDataChanged += (o, e) => webData = service.CurrentWebData;
}
...
}
public class DetailPageViewModel : INotifyPropertChanged
{
private string webData;
public DetailPageViewModel(IWebDataService service)
{
webData = service.CurrentWebData;
service.WebDataChanged += (o, e) => webData = service.CurrentWebData;
}
...
}
public class WebDataService : IWebDataService
{
public string CurrentWebData;
public event EventHandler WebDataUpdated;
...
}
Ninject允许我实例化一个IWebDataService的单一实例,以便主页面和详细页面共享它的相同实例。当Web数据更新时,会触发事件,以便两个视图模型可以更新其Web数据实例,并将此新数据推送到视图中。
以下是我的做法。您可以潜在地重用某些部分,例如拥有某个类的单例实例,可被不同页面访问。一个页面向该单例实例添加一些新数据,并且当数据更新时(事件被触发或在构建期间,如果垃圾收集器有足够的时间来杀死现有页面和/或视图模型实例),另一页读取更新后的数据。这就是它们共享的方式。
如果您想深入了解某个主题,请随时在评论中提问。欢迎Android开发人员加入Windows Phone的行列 :)