在WPF应用程序(使用Devexpress)中,存储数据以便在应用程序重新打开后检索
我想保存组合框中SelectedItem或Item的内容以及DataGrid列顺序,以便在重新打开应用程序时保留信息。 最初,只要应用程序处于打开状态,我就使用以下代码保存数据:在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
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文件是一个不错的选择。