在Xamarin.Forms项目中,我有一个名为DataStore
的中央数据模型,该模型可从Web套接字永久检索JSON数据,将其转换为对象并将其存储在Dictionary
中。我需要从多个ViewModel和Views访问此DataStore
。为了实现这一目标,我做了以下工作:
[assembly: XamlCompilation(XamlCompilationOptions.Compile)]
namespace Foo
{
public partial class App : Application
{
public DataStore dataStore { get; }
public static App current = (App)Application.Current;
public App()
{
InitializeComponent();
dataStore = new DataStore();
MainPage = new MainPage();
}
}
}
DataStore
本身发生以下事件:
namespace Foo
{
public class DataStore
{
Dictionary<int, Target> targetDict;
public EventHandler<Target> targetAdded;
public EventHandler<Target> targetRemoved;
}
}
因此,我可以在需要的所有ViewModel或View中连接到DataModel
的事件,如下所示:
namespace Foo
{
public class TargetMap : Map
{
public List<CustomPin> customPins { get; set; }
public TargetMap() : base()
{
customPins = new List<CustomPin>();
App.current.dataStore.targetAdded += onTargetAdded;
App.current.dataStore.targetRemoved += onTargetRemoved;
}
void onTrackRemoved(object sender, Target t)
{
// Do stuff
}
void onTrackAdded(object sender, Track t)
{
// Do stuff
}
}
}
但是,我遇到了空指针异常,这告诉我初始化顺序有问题。
问题是:
如果需要从多个ViewModels和Views中访问DataStore
之类的中央数据层组件,“ Xamarin”方法将在哪里以及如何初始化?您可以将其设为静态吗?
任何暗示非常感谢!
答案 0 :(得分:1)
据我对您的问题的了解,您有两种选择
1)从数据存储区中创建一个单例(因此是一个静态属性),以使其可在应用程序中的任何位置使用
2)对您的DataStore进行抽象,并在启动时注入该抽象(更好的解决方案imo)
但是,无论您选择哪种解决方案,都仍然会遇到初始化问题。 您应该执行的操作(在您的视图模型中)是在尝试访问任何数据之前调用DataStore方法以对其进行初始化。