2014-10-08 91 views
0

我正在开发一个使用HTML/JavaScript的Windows 8商店应用程序,并且遇到了将一个WinJS.Binding.List存储并检索到Windows.Storage.ApplicationData中的问题.current.roamingSettings。在应用程序数据中存储和检索WinJS.Binding.List

我得到这个工作通过手动滚动我自己的方法将绑定列表转换为XML字符串并存储,然后在检索解析它回到列表中。但是,这似乎是疯狂的低效率,我试图找到更好的方法。我试过JSON.stringify()和JSON.parse(),它们似乎存储和检索正确的数据,但只要我将数据绑定到winControl,应用程序就会崩溃,出现0(根本没有错误消息)。

这里有点我的代码来证明我试图什么(列表是绑定列表):

function onSaveData() { 
    if (list) { 
     Windows.Storage.ApplicationData.current.roamingSettings.values["data"] = JSON.stringify(list); 
    } 
} 

function onLoadData() { 
    var data = Windows.Storage.ApplicationData.current.roamingSettings.values["data"]; 

    if (data) { 
     list = JSON.parse(data); 
     var listview = element.querySelector("#mylistview").winControl; 
     listview.itemsSource = new WinJS.Binding.List(list); 
    } 
} 

我知道我能得到这个工作了很长的路,所以我不找任何解决方案...我真的只是希望有一个简单的方法来存储/检索这些数据对象,我错过了。如果我能找到一个更简单的方法来做到这一点,它将消除约40行代码,我可以停止使用整个库。此外,随着我​​的前进,我计划拥有更多的绑定列表,这些列表也需要存储。谢谢!

回答

2

您需要绑定到列表的DataSource属性,而不是它自己的列表:

listview.itemsSource = new WinJS.Binding.List(list).dataSource; 

DataSource属性是明确的IListDataSource的ListView控件需要一个数据源。 ListView不能直接理解WinJS.Binding.List的任何内容,只能通过特定的接口。 (我在第7章的“数据源的结构”一节中对此进行了讨论,在我的免费电子书Programming Windows Store Apps with HTML, CSS, and JavaScript, 2nd Edition中。)

用JSON保存和重新载入列表完全没问题。

+0

啊。我上面的例子中的“listview”是一个自定义控件,它包装了一个实际的ListView。 itemsSource由实际列表设置,并在内部使用dataSource来设置ListView。你确实回答了我的问题,但关于使用JSON进行保存和重新加载。这意味着我还有其他事情正在进行。谢谢。 – BrianLegg 2014-10-08 03:24:45

+0

您需要确保序列化的JSON实际上是一个数组,以便它在重新加载时成为JavaScript数组,否则List将无法从其中进行初始化。 – 2014-10-08 21:39:50

相关问题