1

我在我的IsolatedStorageSettingsObservableCollection<Recipe>中保存了一个JSON字符串。

该类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
}

目前我只有一个RecipeObservableCollection<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);
}

发生的情况是,在我的数据加载方法中,第一个元素BaseCategories变成了JSONCategory中写入的元素。

在这种情况下,它从早餐变成了开胃菜(这是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

似乎对 ASP.NET 很熟悉。关于方法。您是否注意到“jsonString”变量为空?您试图从可序列化的 json 对象中获取一些东西,而“某物”是空的。并尝试使用显式类型转换为 Recipce 的类型。

于 2013-11-10T19:28:42.800 回答
0

首先,我建议在您的视图模型中使用适当的注释属性:在整个对象上使用 [DataContract],在属性上使用 [DataMember],应该序列化,在属性上使用 [IgnoreDataMember],应该被 JSON.net 忽略.
此外,类 Category 应该使用标准属性,这些属性在特定方法中使用适当的值进行初始化,而不是使用硬编码的 getter:

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 回答