Создание сортированного представления коллекции в WinRT - PullRequest
31 голосов
/ 04 октября 2011

Кто-нибудь пытался создать представление, сортирующее коллекцию?Интерфейс ICollectionView присутствует, и он утверждает, что имеет те же обязанности, что и его аналог WPF / SL (сортировка, разбиение на страницы, фильтрация), однако, если я что-то пропустил, в интерфейсе нет методов / свойств сортировки .

Мне было бы интересно узнать, как взять коллекцию элементов, а затем отсортировать их с помощью представления в WinRT.

Обратите внимание, я знаю, что могу сделать это вручную, однако,Я хочу посмотреть, как отсортированная коллекция взаимодействует с переходами темы WinRT, которые, по-видимому, добавляют визуальные эффекты при выполнении сортировки.

Ответы [ 2 ]

4 голосов
/ 24 июня 2012

К сожалению, в Win8 нет поддержки сортировки представлений коллекции (ни фильтрации, ни группировки).Единственный способ сделать это - напрямую манипулировать источником данных, а затем присвоить его свойству Source.

Это обсуждалось как улучшение для периода после Win8.Жаль, что у меня были лучшие новости :) 1003 *

2 голосов
/ 03 июля 2012

Похоже, что Linq теперь является рекомендуемым способом, когда Sort и Filter стали AWOL.

Таким образом, вы можете принять что-то подобное в своей модели:

    private MyDataSourceProvider dataSource;
    private ObservableCollection<MyType> sortedDataBackingField;

    public ObservableCollection<MyType> SortedData
    {
        get
        {
            return sortedDataBackingField;
        }
        set
        {
            sortedDataBackingField = value;
            NotifyPropertyChanged("SortedData");
        }
    }


    public void SortByName()
    {
        SortedData = new ObservableCollection<MyType>(dataSource.Entities.OrderBy(
          entity => entity.Name));
    }

    public void SortByAge()
    {
        SortedData = new ObservableCollection<MyType>(dataSource.Entities.OrderBy(
           entity => entity.Age));
    }

Подключите SortByName и SortByAgeк вашему пользовательскому интерфейсу в шаблоне по вашему выбору и просто свяжите со свойством SortedData:

<ItemsControl ItemsSource=”{Binding SortedData}”/>

Edit: Применительно к переходам вы должны обнаружить, что этот подход вызовет AddDeleteThemeTransitionдля предметов, которые вы отсортировали;просто добавьте что-то вроде этого в ItemsControl:

<ItemsControl.ItemContainerTransitions>
    <TransitionCollection>
        <AddDeleteThemeTransition></AddDeleteThemeTransition>
    </TransitionCollection>
</ItemsControl.ItemContainerTransitions>
...