在listview中对分组的项目进行排序

时间:2013-02-12 20:50:05

标签: javascript windows-8 winjs

我需要在组中对单个项目进行排序。 Listview api允许我创建排序组或排序整个列表。 我需要在各个组中对项目进行排序。

有可能吗?

2 个答案:

答案 0 :(得分:1)

我正在努力解决同样的问题,既没有找到有用的例子,也没有提示。然后我开始组合SortedListProjection和GroupedSortedListProjection,最后使它工作。

我的用例是按字母顺序,升序排列组,但在组内,按时间戳排序,降序。

以下是我在JavaScript文件中设置的方法:

var list = new WinJS.Binding.List(); // list gets populated later in the code
var sortedList = list.createSorted(compareItems);
var groupedList = list.createGrouped(getGroupKey, getGroupData, compareGroups);

WinJS.Namespace.define("my.stuff", {
    sortedList: sortedList,
    groupedList: groupedList
});

重要的是保持项目排序与分组同步。因此,项目排序功能是调用分组功能。

以下是用于排序和分组的所有四个函数:

compareItems = function (leftItem, rightItem) {
    let leftKey = getGroupKey(leftItem);
    let rightKey = getGroupKey(rightItem);
    let compare = compareGroups(leftKey, rightKey);
    if (compare == 0) { // if keys are equal compare timestamps
        return leftItem.timestamp < rightItem.timestamp ? 1
            : leftItem.timestamp > rightItem.timestamp ? -1 : 0;
    }
    return compare;
};

getGroupKey = function (item) {
    return item.name + item.category;
};

getGroupData = function (item) {
    return {
    name: item.name + " (" + item.category + ")"
    };
};

compareGroups = function (leftKey, rightKey) {
    return leftKey.toUpperCase().localeCompare(rightKey);
};

最后,ListView的两个列表的组合声明:

<div id="dataDeliveriesList" class="hidden"
    data-win-control="WinJS.UI.ListView"
    data-win-options="{
        itemDataSource: my.stuff.sortedList.dataSource,
        itemTemplate: select('#itemTemplate'),
        groupDataSource: my.stuff.groupedList.groups.dataSource,
        groupHeaderTemplate: select('#groupHeaderTemplate'),
        layout: {
            type: WinJS.UI.ListLayout
        }
    }">
</div>

答案 1 :(得分:0)

这是可能的。 ObservableCollection不提供排序选项,因此您必须创建一个在所选属性上排序的新集合。请参阅下面的示例代码有关其他排序选项,请参阅博文hereanother stackoverflow thread

// TODO: Create an appropriate data model for your problem domain to replace the sample data
var group = SampleDataSource.GetGroup((String)navigationParameter);
this.DefaultViewModel["Group"] = group;
//this.DefaultViewModel["Items"] = group.Items;

// Sort items by creating a new collection
ObservableCollection<SampleDataItem> grpSorted = new ObservableCollection<SampleDataItem>(
group.Items.OrderBy(grp => grp.Title));

this.DefaultViewModel["Items"] = grpSorted;