0

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

4

1 に答える 1

0

これは、監視可能なコレクションに含まれる型のシリアル化が失敗したことが原因である可能性があります。まず、シリアル化インターフェイスの継承を実装するか、[Serializable] 属性を適用して、BrowserItem 型をシリアル化可能としてマークする必要があります。

[Serializable]
public class BrowserItem
{

}

実際、BrowserItem (または設定に保存しようとしているその他の型) がシリアライズ可能である場合は、この Q/Aが役立つ場合があります。

同様に、タイプがすでにシリアライズ可能である場合は、コレクションのサンプルを xml ファイルでディスクにシリアライズすることをお勧めします。これにより、タイプがシリアライズされたときに問題を引き起こしている可能性があるものを手動/視覚的に調べることができます。逆シリアル化された

于 2012-09-25T04:25:27.240 に答える