Связывание двух разных источников коллекций в 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
}
}
- Запрограммированные пользовательские функции сравнения, но я уверен, что кто-то имеет потрясающую библиотеку, делающую именно это.
- Мысль о добавлении различий для категорий фасетов тоже, но она не предназначена для этого. Я предполагаю, что рекомендуемый способ - убедиться, что клиент знает обо всех доступных категориях, чтобы их можно было использовать для фильтрации.