Singleton作为应用资源 - 创建了2个实例?

时间:2015-08-11 15:58:05

标签: xaml windows-runtime windows-store-apps winrt-xaml

我有一个Windows 8.1商店应用程序。 有一个单例类,我保留一些数据。我已经将单例的静态属性定义为app资源 -

 Application.Current.Resources.Add("CSettings", CSettings.Instance.Data);

我将各种xaml属性绑定到其中的适当属性

<ToggleSwitch x:Name="m_cConnectionModeToggle" OnContent="Enabled" OffContent="Disabled"  
IsOn="{Binding IsTCPConnection, Source={StaticResource CSettings}, Mode=TwoWay}" />

我以为我能通过通常的方式访问我的单例...实例getter-但是当我去CSettings.Instance.Data时,我得到的是一个与被绑定的实例不同的实例(并且已经更改) )。

这里是否创建了2个相同类的单例实例?

一个在CSettings上使用.Instance getter而另一个在此.Resources [“CSettings”]?

我在某处实施失败了吗?我的意思是,这是一种合理的方法来获得可更改的应用程序范围的资源,我能够以编程方式绑定和使用吗?

1 个答案:

答案 0 :(得分:0)

在我看来,当您向Resources字典添加值时,它不会将其存储为引用,但会创建一个新值。

我的建议是使用像MVVM框架一样使用的IoC容器。例如来自MVVM light的SimpleIoc。您不必在应用程序中实现MVVM,只需使用容器即可。

这样做的方法是创建一个类并将其注册为App.xaml中的资源。在那个类中注册你的容器

的App.xaml

<MyC:MyClass x:Key="Locator" d:IsDataSource="True" xmlns:MyC="clr-namespace:MyProject.MyClassFolder" />

MyClass.cs

ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);


SimpleIoc.Default.Register<MyData>();

public MyData { get {return ServiceLocator.Current.GetInstance<MyData>();}}

注意:您将需要Microsoft.Services.ServiceLocation和Galasoft.Mvvmlight.Ioc.SimpleIoc,您可以从Nuget获得这两者。

然后在xaml中,你可以像那样访问MyData.IsTCPConnection字段

IsOn="{Binding MyData.IsTCPConnection, Source={StaticResource Locator}, Mode=TwoWay}" 

并在代码中

 MyData myData = SimpleIoc.Default.GetInstance<MyData>();
 myData.IsTCPConnection = ...;