Я записал Пользовательское Управление WPF с поисковым расширением, давайте назовем его MyControl
. Управление является потомком ItemsControl
класс.
Таким образом, я подаю источник данных к нему как это:
Само управление использует
protected override void OnItemsSourceChanged(System.Collections.IEnumerable oldValue, System.Collections.IEnumerable newValue)
{
if (newValue != null)
{
ICollectionView view = CollectionViewSource.GetDefaultView(newValue);
view.Filter += this.FilterPredicate;
}
if (oldValue != null)
{
ICollectionView view = CollectionViewSource.GetDefaultView(oldValue);
view.Filter -= this.FilterPredicate;
}
base.OnItemsSourceChanged(oldValue, newValue);
}
отфильтровать представление исходного набора (таким образом отображающий его во внутреннем ListBox).
Теперь предположите, что у нас есть 10 из этих MyControls, определенных в XAML с тем же DynamicSource. Проблема состоит в том, что, если один из них применяет Фильтр на исходный набор, он будет влиять на все другие экземпляры также.
Как Вы изменили бы Управление для предотвращения этого поведения?
В таких ситуациях, вы, как правило, хотите создать отдельный экземпляр iCollopeView для каждого по-разному отфильтрованного использования коллекции. Это не очень хорошая идея использовать конкретную реализацию ICOLLICEVIEW, поскольку это возможно для того, чтобы выбрать тип CollectionView, необходимый для изменения, если элементыSource связаны с другим типом коллекции. Использование
ICollectionView filteredView = new CollectionViewSource { Source=newValue }.View;
даст вам iconglecteview, который автоматически правильный тип.
К сожалению, то, что вы можете найти в этом случае, состоит в том, что очень трудно применить другую коллекцию для PerfulsPresenter вашего пользовательского контроля, поскольку все это магия сделана для вас базовым элементом Class Class и опирается на элементы / Предметы свойства, которые он управляет. Это происходит при использовании чего-то похожего на шаблон itemsControl по умолчанию.
Если вы на самом деле используете отдельный элемент управления ListBox (и Templatebinding все свойства элементовSource, если вам они нуждаются в их) Внутри вашей ControlTemplate, то вы сможете просто добавить новый iconglecteview DP (я бы порекомендовал только для чтения) Ваш элемент управления для удержания отфильтрованной версии коллекции и связывает элементы элемента «Шаблон ListBox» к этой новой собственности.
Проблема в том, что CollectionViewsource.getDefaultView (объект)
всегда вернет один и тот же Iconglecteview
экземпляр для данного источника, и это то, что любые Установка элементовControl
будет использоваться при отображении этого источника.
Вы можете обойти это, создав новый экземпляр ICOLLECTIONView
, который будет использоваться каждый элемент управления, который вы хотите, чтобы вы могли самостоятельно фильтровать коллекцию, а затем явно привязав к элементам
Свойство каждого контроля на этот конкретный вид. Тип ICOLLICEVEWVEW
необходимо будет зависеть от вашего сценария, но ListCollectionView
обычно подходит.