1

ListViewがdataSource内のオブジェクトの最新の詳細を表示しないという問題があります。dataSourceは、WinJS.Binding.ListオブジェクトのcreateSortedメソッドを呼び出すことによって作成されます。各オブジェクトは次のようになります。

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が更新されて新しいタイトルが表示されません。私は何が間違っているのですか?

4

1 に答える 1

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();
};
于 2012-09-04T05:31:11.690 に答える