访问应用程序中任何位置的对象(C#/ WPF)

时间:2018-11-13 15:53:27

标签: c# wpf

我正在将XML文档反序列化为自定义对象,并且我希望该数据在整个应用程序中的任何地方都可用。

我在MainWindow.xaml.cs中实例化了这个公共类,但我不知道如何从其他UserControls和ViewModels访问该对象。

一些最佳做法和示例?

将此对象视为保存我希望能够从任何屏幕读取,更新和保存的所有应用程序数据。 (有些数据可能很复杂,所以我不想将其存储在设置中。我需要读写XML文件。)

谢谢!

2 个答案:

答案 0 :(得分:0)

我要做的是使用保存当前数据或任何您想调用的数据的服务。我将它作为单例注入类中,因此所有类都具有相同的引用。在Web客户端,它称为数据存储。

答案 1 :(得分:0)

您可以通过e实现。 G。实现管理您的自定义实现(包括序列化/反序列化)的静态类。

public static class Config
{
    public static YourCustomType Data { get; private set; }

    public static void LoadXml()
    {
        Data = YourDeserializationLogic();
    }

    public static void SaveXml()
    {
        YourSerializationLogic(Data);
    }
}

如果您想充分利用通知更改传播的全部功能,可以考虑在静态类中使用类型ObservableCollection<T>的单独属性:

public static ObservableCollection<AnotherCustomType> ObservableData  { get; private set; } = new ObservableCollection<AnotherCustomType>();

只需确保在LoadXml()逻辑中必须逐项填充这些属性,ObservableCollection才能发出事件:

public static void LoadXml()
{
    ...

    foreach (YourType item in YourData)
    {
        ObservableData.Add(item);
    }
}

与e相比,我更喜欢此选项。 G。单例,因为我可以完全控制启动顺序Config.LoadWhatever()的调用时间。

对我来说这很重要,因为我喜欢记录配置负载(也可以通过单例实现,是的,但是恕我直言,如果始终创建各个实例,则单例的原理是无效的在启动顺序的固定位置-尽管我很高兴学习其他优点(如果有的话)。