0

個々のアイテムをグループで並べ替える必要があります。Listview API を使用すると、並べ替えられたグループを作成したり、リスト全体を並べ替えたりできます。それぞれのグループでアイテムをソートする必要があります。

出来ますか?

4

2 に答える 2

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
});

重要なことは、アイテムの並べ替えをグループ化と同期させることでした。したがって、アイテムの並べ替え関数はグループ化関数を呼び出しています。

以下は、並べ替えとグループ化に使用される 4 つの関数すべてです。

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>
于 2016-11-22T23:15:50.237 に答える
0

それが可能だ。ObservableCollection はソート オプションを提供しないため、選択したプロパティでソートされる新しいコレクションを作成する必要があります。以下のサンプルコードを参照してください。その他の並べ替えオプションについては、こちらのブログ投稿と別のスタックオーバーフロー スレッドをお読みください。

// 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;
于 2013-02-14T06:02:45.057 に答える