Xamarin初始化命令

时间:2019-01-25 08:35:01

标签: c# xamarin xamarin.forms xamarin.ios initialization

在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”方法将在哪里以及如何初始化?您可以将其设为静态吗?

任何暗示非常感谢!

1 个答案:

答案 0 :(得分:1)

据我对您的问题的了解,您有两种选择

1)从数据存储区中创建一个单例(因此是一个静态属性),以使其可在应用程序中的任何位置使用

2)对您的DataStore进行抽象,并在启动时注入该抽象(更好的解决方案imo)

但是,无论您选择哪种解决方案,都仍然会遇到初始化问题。 您应该执行的操作(在您的视图模型中)是在尝试访问任何数据之前调用DataStore方法以对其进行初始化。