我有一个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”]?
我在某处实施失败了吗?我的意思是,这是一种合理的方法来获得可更改的应用程序范围的资源,我能够以编程方式绑定和使用吗?
答案 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 = ...;