我一直在使用一个帮助器类,它使用键值对从孤立存储中保存和检索值。这适用于我的应用程序中更改的单个值,但我现在尝试将其用于ObservableCollection,其中将在运行时添加和删除项目。出于某种原因,当关闭并重新打开应用程序时,不会从IsolatedStorage存储和/或检索我的ObservableCollection。我不确定我做错了什么,因为这对个人价值观有效吗?
Setting.cs
public class Setting<T>
{
string name;
T value;
T defaultValue;
bool hasValue;
public Setting(string name, T defaultValue)
{
this.name = name;
this.defaultValue = defaultValue;
}
public T Value
{
get
{
//Check for the cached value
if (!this.hasValue)
{
//Try to get the value from Isolated Storage
if (!IsolatedStorageSettings.ApplicationSettings.TryGetValue(this.name, out this.value))
{
//It hasn't been set yet
this.value = this.defaultValue;
IsolatedStorageSettings.ApplicationSettings[this.name] = this.value;
}
this.hasValue = true;
}
return this.value;
}
set
{
//Save the value to Isolated Storage
IsolatedStorageSettings.ApplicationSettings[this.name] = value;
this.value = value;
this.hasValue = true;
}
}
public T DefaultValue
{
get { return this.defaultValue; }
}
// Clear cached value
public void ForceRefresh()
{
this.hasValue = false;
}
}
上面的Setting.cs类用于存储和检索值,我使用另一个名为Settings.cs的类作为使用这些存储值的机制。
Settings.cs
public static Setting<ObservableCollection<BrowserItem>> BrowserList = new Setting<ObservableCollection<BrowserItem>>("Browsers", new ObservableCollection<BrowserItem>());
public static Setting<string> InitialUri = new Setting<string>("InitialUri", "http://www.bing.com");
在上文中,可以更改InitialUri
并正确保存和检索值。另一方面,BrowserList
(BrowserItem类型的ObservableCollection(自定义类))是否未存储或保存?以下显示了我尝试使用BrowserList
BrowserItem.cs
[DataContract]
public class BrowserItem
{
[DataMember]
public FullWebBrowser Browser
{
get;
set;
}
[DataMember]
public string Url
{
get;
set;
}
[DataMember]
public BitmapImage ImageUri
{
get;
set;
}
[DataMember]
public string Title
{
get;
set;
}
[DataMember]
public string Notification
{
get;
set;
}
[DataMember]
public bool DisplayNotification
{
get
{
return !string.IsNullOrEmpty(this.Notification);
}
}
[DataMember]
public string Message
{
get;
set;
}
[DataMember]
public string GroupTag
{
get;
set;
}
[DataMember]
//for translation purposes (bound to HubTile Title on MainPage)
public string TileName
{
get;
set;
}
}
TabsPage.xaml.cs
void addNew_Click(object sender, EventArgs e)
{
BitmapImage newTileImage = new BitmapImage();
var newItem = new BrowserItem() { Browser = new FullWebBrowser(), Url = "http://www.bing.com", ImageUri = newTileImage, Title = "new", /*Notification = "",*/ Message = "new browser", GroupTag = "TileGroup", TileName = "new" };
newItem.Browser.InitialUri = Settings.InitialUri.Value; //set the initial uri when created
Settings.BrowserList.Value.Add(newItem); //update saved BrowserList
}
在addNew_Click
偶数处理程序中,成功添加了名为BrowserItem
的新newItem
。但是当应用程序关闭或重新打开时,我会检查BrowserList
以查看是否存在项目,如果有,我想根据ObservableCollection中的项目索引值加载特定项目。每次我执行检查时,BrowserList
都没有保存的项目?如何在集合中正确保存这些值以便它们能够持久存在?
答案 0 :(得分:0)
这可能是由于可观察集合中包含的类型的序列化失败。 首先,您的BrowserItem类型需要通过实现序列化接口的继承或应用[Serializable]属性来标记为可序列化:
[Serializable]
public class BrowserItem
{
}
事实上,如果BrowserItem(或您尝试保存到设置的任何其他类型)是可序列化的,那么this Q/A可以为您提供帮助。
同样,如果您的类型已经可序列化,您可能希望将集合的样本序列化为xml文件中的磁盘,这样您就可以手动/可视地检查类型可能导致问题的原因(如果有的话)序列化/反序列化