1

我有一个 ALPHA 应用程序,它允许您从 XPS 文件中获取混淆字体并存储 .odttf 文件以在 Silverlight 中使用。该应用程序“工作”就像它在锡上所说的那样,尽管是以一种非常粗糙的方式。

在清理此工具以创建 BETA 的过程中,我可以解决一个问题。我希望应用程序以向导样式布局,该样式将从用户那里收集数据,例如要使用的字体、提取文件的保存位置等。

在当前的实现中,这一切都在后面的代码中完成(实际上它调用了一个帮助类)。但实施向导意味着每条数据都收集在不同的“页面”上。我不想简单地使用页面构造函数传递数据,因为我正在尝试实现旨在保持代码干净的 MVVM。

我想我正在寻找的是持久化窗口的代码中的数据存储。这样我就可以在我的窗口(视图)中获取数据,通过绑定将其传递给我的视图模型并将其发送到窗口模型(数据类)以存储在某处。

我可以使用数据库或 XML 文件,但对于我需要的几条信息来说,这似乎是一种过度存储。

所以总而言之,有没有办法让内存中的对象持久化窗口调用并且可以被多个模型(类)引用。

谢谢!

4

2 回答 2

2

静态类或单例来存储您的数据并从您的所有视图中访问它?

于 2010-01-06T13:56:39.230 回答
0

最好的方法是对所有页面使用相同的 ViewModel,然后如果您以后想使用它,则对其进行序列化。

public class MyViewModel
{
    // Properties to be serialized
    public string MyViewModelProperty1 = "";
    public string MyViewModelProperty2 = "";

    // Save to file.
    public virtual bool Save(string viewmodelFilePath)
    {
        try
        {
            Directory.CreateDirectory(Path.GetDirectoryName(viewmodelFilePath));
            StreamWriter write = new StreamWriter(viewmodelFilePath);
            XmlSerializer xml = new XmlSerializer(GetType());
            xml.Serialize(write, this);
            write.Close();
        }
        catch
        {
            return false;
        }
        return true;
    }

    // Load from file.
    public static object Load(Type type, string viewmodelFilePath)
    {
        StreamReader reader;
        object settings;
        XmlSerializer xml = new XmlSerializer(type);

        try
        {
            reader = new StreamReader(viewmodelFilePath);
            viewmodel = xml.Deserialize(reader);
            reader.Close();
        }
        catch
        {
            viewmodel = 
                type.GetConstructor(System.Type.EmptyTypes).Invoke(null);
        }
        return viewmodel;
    }
}

Petzold 书中的原始代码

于 2010-01-06T13:26:16.323 回答