我遇到的问题是ListView未在其dataSource中显示对象的最新详细信息。通过调用WinJS.Binding.List对象的createSorted method来创建dataSource。每个对象如下所示:
var obj = {
title: 'First item',
priority: 2
};
我创建/设置dataSource如下:
sortedItemList = itemList.createSorted(function (lhs, rhs) {
return rhs.priority - lhs.priority;
});
listView.itemDataSource = sortedItemList.dataSource;
ListView的itemTemplate如下所示:
<div id="itemTemplate" data-win-control="WinJS.Binding.Template">
<div>
<h4 data-win-bind="innerText: title"></h4>
</div>
</div>
这两个字段的更改处理程序如下所示:
titleControl.onchange = function () {
curItem.title = titleControl.value;
sortedItemList.notifyMutated(sortedItemList.indexOf(curItem););
};
priorityControl.onchange = function () {
curItem.priority = priorityControl.value;
sortedItemList.notifyMutated(sortedItemList.indexOf(curItem););
};
createSorted的文档说明每当对象发生变化时都要调用notifyMutated。如果我更改优先级,则ListView将适当地移动项目。但是如果我编辑标题,则ListView不会更新以显示新标题。我做错了什么?
答案 0 :(得分:1)
当调用其底层dataSource上的notifyMutated时,ListView似乎没有显式重新绑定其元素。如果对notifyMutated的调用导致元素被移动,那么它将被反弹,因为元素被销毁并重新创建。否则,您需要重新绑定。我的更改处理程序现在看起来像这样:
var notifyMutated = function () {
var prevIndex,
postIndex;
prevIndex = sortedItemList.indexOf(curItem);
sortedItemList.notifyMutated(prevIndex);
postIndex = sortedItemList.indexOf(curItem);
if (postIndex !== prevIndex) {
WinJS.Binding.processAll(listView.elementFromIndex(postIndex), curItem);
}
};
titleControl.onchange = function () {
curItem.title = titleControl.value;
notifyMutated();
};
priorityControl.onchange = function () {
curItem.priority = priorityControl.value;
notifyMutated();
};