キーと値のペアを使用して分離ストレージから値を保存および取得するヘルパー クラスを使用しています。これは、アプリケーションで変更された個々の値に対して機能しましたが、実行時に項目が追加および削除される ObservableCollection に使用しようとしています。何らかの理由で、アプリケーションを閉じて再度開いたときに、ObservableCollection が IsolatedStorage に保存および/または取得されません。これは個々の値に対してうまく機能するため、何が間違っているのかわかりません。
設定.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
アイテムが保存されていませんか? これらの値が保持されるように、これらの値をコレクションに適切に保存するにはどうすればよいですか?