Связывание двух разных источников коллекций в Pivotviewer

Я пытаюсь понять, как управлять переходом между двумя коллекциями в pivotviewer. Коллекции имеют одинаковые изображения, просто обрабатывается одна коллекция. Я хочу, чтобы одна коллекция исчезла в другой.

Я знаю, как определить различные шаблоны, которые исчезают один за другим, фиксируя максимальную пропускную способность. Например, если вы увеличите масштаб до 300 пикселей, у вас будет новый шаблон, пока вы не достигнете 500 пикселей и т. Д. Код, который я использую для привязки коллекции, которую я загрузил в коде, выглядит следующим образом:

<pv:PivotViewerItemTemplate x:Key="firstTemplate" MaxWidth="300">
    <!-- template layout -->
    <pv:PivotViewerMultiScaleSubImageHost CollectionSource="{Binding [VisualCollectionSource][0] }"  ImageId="{Binding [VisualImageId][0]}" />
    <!-- template layout -->
</pv:PivotViewerItemTemplate>

Есть ли такое решение, которое я могу принять? Какова лучшая практика для этого?

1 ответ

Вот пример сохранения перекрытия между загруженными коллекциями CXML вместо замены всей коллекции. Поскольку при добавлении и удалении объектов есть анимация, это выглядит довольно красиво. Полезно при запросе дополнительных / частичных данных с сервера / бэкэнда. (Конечно, это не имеет ничего общего с "исчезающими коллекциями / элементами" при масштабировании.)

Самый интересный код будет в KeepIntersection(this ICollection<PivotViewerItem> currentItems, CxmlCollectionSource newItems), который изменяет коллекцию, добавляя и удаляя только отличия от старой и новой коллекций.

Основано на Silverlight 5 PivotViewer ObservableCollection согласно учебникам / постам Тони Чемпиона и Криса Арнольда.

MainPageViewModel.cs

private void CxmlCollectionSource_StateChanged(object sender, CxmlCollectionStateChangedEventArgs e)
{
    // TODO: check other states
    switch (e.NewState)
    {
        case CxmlCollectionState.Loaded:
            {
                var collection = sender as CxmlCollectionSource;

                Debug.Assert(collection != null, "collection != null");

                // TODO: don't add/remove, replace the entire list after diffing
                if (!this.pivotProperties.Any())
                {
                    // TODO: diffing algorithm for properties, minimal changes
                    foreach (var pivotViewerProperty in collection.ItemProperties)
                    {
                        this.pivotProperties.Add(pivotViewerProperty);
                    }
                }

                this.pivotViewerItems.KeepIntersection(collection);

                break;
            }
    }
}

ICollection {PivotViewerItem} Extensions.cs

namespace SilverlightPivotViewer.Extensions
{
    #region Using directives

    using System.Collections.Generic;
    using System.Linq;
    using System.Windows.Controls.Pivot;

    #endregion

    public static class ICollectionPivotViewerItemExtensions
    {
        #region Public Methods and Operators

        public static void KeepIntersection(
            this ICollection<PivotViewerItem> currentItems, CxmlCollectionSource newItems)
        {
            RemoveCurrentUniqueItems(currentItems, newItems);

            AddNewUniqueItems(currentItems, newItems);
        }

        #endregion

        #region Methods

        private static void AddNewUniqueItems(ICollection<PivotViewerItem> currentItems, CxmlCollectionSource newItems)
        {
            IEnumerable<PivotViewerItem> onlyInNewCollection =
                newItems.Items.Where(pivotViewerItem => currentItems.All(i => i.Id != pivotViewerItem.Id));

            foreach (var pivotViewerItem in onlyInNewCollection)
            {
                currentItems.Add(pivotViewerItem);
            }
        }

        private static void RemoveCurrentUniqueItems(
            ICollection<PivotViewerItem> currentItems, CxmlCollectionSource newItems)
        {
            IEnumerable<PivotViewerItem> onlyInCurrentCollection =
                currentItems.Where(pivotViewerItem => newItems.Items.All(i => i.Id != pivotViewerItem.Id));

            // Need to produce a list, otherwise it will crash (concurrent looping and editing the IEnumerable, or something related)
            var onlyInCurrentCollectionList = onlyInCurrentCollection.ToList();

            foreach (var pivotViewerItem in onlyInCurrentCollectionList)
            {
                currentItems.Remove(pivotViewerItem);
            }
        }

        #endregion
    }
}
  • Запрограммированные пользовательские функции сравнения, но я уверен, что кто-то имеет потрясающую библиотеку, делающую именно это.
  • Мысль о добавлении различий для категорий фасетов тоже, но она не предназначена для этого. Я предполагаю, что рекомендуемый способ - убедиться, что клиент знает обо всех доступных категориях, чтобы их можно было использовать для фильтрации.
Другие вопросы по тегам