2012-09-04 107 views
1

我在ListView的数据源中没有显示对象的最新详细信息时遇到问题。 dataSource通过调用WinJS.Binding.List对象的createSorted method来创建。每个对象看起来是这样的:当底层对象发生变化时,ListView不会更新

var obj = { 
    title: 'First item', 
    priority: 2 
}; 

我创建/设置DataSource这样的:

sortedItemList = itemList.createSorted(function (lhs, rhs) { 
    return rhs.priority - lhs.priority; 
}); 
listView.itemDataSource = sortedItemList.dataSource; 

ItemTemplate中为ListView看起来像这样:

<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不会更新以显示新标题。我究竟做错了什么?

回答

1

当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(); 
}; 
+0

如果您使用JS模板,该代码如何工作? – rbyrne

相关问题