在WPF应用程序(使用Devexpress)中,存储数据以便在应用程序重新打开后检索

在WPF应用程序(使用Devexpress)中,存储数据以便在应用程序重新打开后检索,wpf,caching,mvvm,devexpress,Wpf,Caching,Mvvm,Devexpress,我想保存组合框中SelectedItem或Item的内容以及DataGrid列顺序,以便在重新打开应用程序时保留信息。 最初,只要应用程序处于打开状态,我就使用以下代码保存数据: App.Current.Properties[1] = SelectedDataSetList; App.Current.Properties[2] = SelectedModuleList; App.Current.Properties[0] = SelectedContentSet; SelectedDataS

我想保存组合框中SelectedItem或Item的内容以及DataGrid列顺序,以便在重新打开应用程序时保留信息。 最初,只要应用程序处于打开状态,我就使用以下代码保存数据:

App.Current.Properties[1] = SelectedDataSetList; 
App.Current.Properties[2] = SelectedModuleList;
App.Current.Properties[0] = SelectedContentSet;
SelectedDataSetList绑定到一个组合框:

<dxe:ComboBoxEdit Text="SCOPE" x:Name="ContentSetCombobox" Grid.Column="1" Height="25" IncrementalFiltering="True" ItemsSource="{Binding ContentSetList}" DisplayMember="Name" AllowUpdateTwoWayBoundPropertiesOnSynchronization="False"  SelectedItem="{Binding SelectedContentSet,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" >
但是,即使应用程序关闭并再次打开,我也无法将信息存储在用于检索的内存中


有没有办法不用像.xml这样的外部文件就可以做到这一点?

如果你想保存到IsolatedStorage,你可以使用我创建的这个类,见下文。它不是完美的,如果您试图保存一个未标记为可序列化的类型,但它足以供随意使用,那么它将失败。我将异常处理作为OP的练习

public class IsolatedStorageManager
{
    public void Save<T>(T item, string key)
    {
        var isf = IsolatedStorageFile.GetStore(IsolatedStorageScope.User | IsolatedStorageScope.Assembly, null, null);
        using (var writeStream = new IsolatedStorageFileStream(key, FileMode.Create, isf))
        {
            Serialise(item, writeStream);
        }
    }

    public T Open<T>(string key)
    {
        var isf = IsolatedStorageFile.GetStore(IsolatedStorageScope.User | IsolatedStorageScope.Assembly, null, null);
        using (var readStream = new IsolatedStorageFileStream(key, FileMode.Open, isf))
        {
            var item = Deserialise<T>(readStream);
            return item;
        }
    }

    private Stream Serialise<T>(T item, Stream stream)
    {
        var formatter = new BinaryFormatter();
        formatter.Serialize(stream, item);
        return stream;
    }

    private T Deserialise<T>(Stream stream)
    {
        var formatter = new BinaryFormatter();
        var item = formatter.Deserialize(stream);
        return (T) item;
    }
}
下面的测试夹具演示了如何保存类和数据集

[TestFixture]
public class IsolatedStorageManagerTestFixture
{
    private IsolatedStorageManager _underTest;
    private const string SaveFileKey = "TestSaveFileKey";

    [SetUp]
    public void SetUp()
    {
        _underTest = new IsolatedStorageManager();
    }

    [Test]
    public void TestSavingDataset()
    {
        var tableName = "TestTable";

        var ds = new DataSet();
        ds.Tables.Add(new DataTable(tableName));
        _underTest.Save(ds, SaveFileKey);

        var saved = _underTest.Open<DataSet>(SaveFileKey);

        Assert.That(saved.Tables.Count==1);
        Assert.That(saved.Tables[0].TableName == tableName);
    }

    [Test]
    public void TestSavingClass()
    {
        var list = new ArrayList {"Hello", new DataTable(), 2};

        _underTest.Save(list,SaveFileKey);

        var saved = _underTest.Open<ArrayList>(SaveFileKey);

        Assert.That(saved.Count==3);
        Assert.That(string.Equals((string)saved[0], "Hello"));
        Assert.That(list[1] is DataTable);
        Assert.That((int)list[2] == 2);
    }
}

当我无法将信息存储在内存中以便检索时,即使应用程序关闭并再次打开,您是否可以重新设置相位。?我不能完全理解这里的问题是什么。我无法存储和检索Combobox.SelectedItem之类的信息。我尝试使用IsolatedStorage,但我不知道如何将数据集保存到IsolatedStorage中并重新获取它。您也可以在不使用外部文件的情况下将信息保存在Registry中?不是真的。看一看,我认为问题在于组合框的SelectedItem不是简单的数据类型,如字符串或整数,因此无法直接添加到应用程序设置中。存储数据集的外部xml文件是一个不错的选择。