1

IsolatedStorageSettingsにJSON文字列ObservableCollection<Recipe>として保存しました。

このクラスには、次のコードによって初期化されるというRecipeフィールドがあります。Category

[JsonProperty]
private Category _category = RecipesViewModel.BaseCategories.First();

ACategoryは次のようなものです。

[JsonProperty]
public Categories BaseCategory;

/// <summary>
///     Background picture for the cagtegory
/// </summary>
public string Picture
{
    get { return string.Format(@"/Assets/CategoriesPictures/{0}.jpg", BaseCategory); }
}
/// <summary>
///     Category's name
/// </summary>
public string Name
{
    get { return BaseCategory.ToString(); }
}

/// <summary>
///     List of recipes that belong to this category
/// </summary>
public IEnumerable<Recipe> Recipes
{
    get { return App.ViewModel.GetRecipesByCategory(this); }
}

/// <summary>
/// We need this to let everyone know that something may have been changed in our collections
/// </summary>
public void UpdateCategory()
{
    RaisePropertyChanged(() => Recipes);
}

BaseCategory単純な列挙型はどこですか

public enum Categories
{
    Breakfast,
    Lunch,
    Appetizer,
    Sidedish,
    Soup,
    Dessert,
    Beverages
}

現時点では、 に 1 つしかありません。RecipeこれObservableCollection<Recipe>は、 IsolatedStorageSettingsに保存されているJSONです。

[
  {
    "_addedDate": "2013-11-10T19:08:00.8968706+01:00",
    "_category": {
      "BaseCategory": 2
    },
    "_ingredients": [],
    "_recipeName": "recipeName",
    "_steps": [],
    "_temperature": 0.0
  }
]

は次のBaseCategoriesように宣言されています。

public static ReadOnlyCollection<Category> BaseCategories { get; private set; }

そして、それはこの方法で構築されています:

private static void BuildCategories()
{
    var categories = new ObservableCollection<Category>();
    foreach (var enumValue in from category in typeof(Categories).GetFields()
                              where category.IsLiteral
                              select (Categories)category.GetValue(typeof(Categories)))
    {
        categories.Add(new Category { BaseCategory = enumValue });
    }
    BaseCategories = new ReadOnlyObservableCollection<Category>(categories);
}

何が起こるかというと、私のデータ読み込みメソッドの間に、 の最初の要素がBaseCategoriesJSONCategory書き込まれたものになります。

この場合、BreakfastからAppetizerに変わります(これはCategory、唯一保存された のRecipeです)。

これは、データをロードするために使用するコードです。

public void LoadData()
{
    if (BaseCategories.IsEmpty())
        BuildCategories();
    // Load data from IsolatedStorage
    var jsonString = "";
    if (IsolatedStorageSettings.ApplicationSettings.TryGetValue(RecipesKey, out jsonString))
    {
        // BEFORE THIS LINE EVERYTHING IS FINE
        Recipes = JsonConvert.DeserializeObject<ObservableCollection<Recipe>>(jsonString);
        // AFTER THIS LINE, THE FIRST CATEGORY IN BaseCategories IS CHANGED
    }
    UpdateCategories();
    IsDataLoaded = true;
}

そこで何が起こっているか知っている人はいますか?

私は一日中このコードに取り組んできたので、今のところ私の頭は消えています!

4

2 に答える 2

0

まず、ビュー モデルで適切な注釈属性を使用することをお勧めします: [DataContract] をオブジェクト全体に、[DataMember] をシリアル化する必要があるプロパティに、[IgnoreDataMember] をプロパティに使用して、JSON.net で無視する必要があります。 .
また、クラス Category は、ハードコードされたゲッターを使用する代わりに、特定のメソッドで適切な値で初期化される標準プロパティを使用する必要があります。

public Categories BaseCategory { get; set; }
public string Picture { get; set; }
public string Name { get; set; }
public IEnumerable<Recipe> Recipes { get; set; } 

レシピでは、シリアル化された BaseCategory と IgnoreDataMember カテゴリを使用します。

[DataMember]
public Categories BaseCatagory { get; set; }
[IgnoreDataMember]
public Category Category { get; set; }

何らかの形で役立つ場合はお知らせください。

于 2013-11-10T19:47:01.453 に答える
0

ASP.NET に非常になじみがあるようです。方法について。「jsonString」変数が空であることに気付きましたか? シリアル化可能な json オブジェクトから何かを取得しようとしていますが、「何か」は空です。そして、Recipce の型への明示的な型変換を使用してみてください。

于 2013-11-10T19:28:42.800 に答える