WPF CollectionViewSource несколько представлений?

Я записал Пользовательское Управление 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. Проблема состоит в том, что, если один из них применяет Фильтр на исходный набор, он будет влиять на все другие экземпляры также.

Как Вы изменили бы Управление для предотвращения этого поведения?

17
задан PaN1C_Showt1Me 29 January 2010 в 09:25
поделиться

2 ответа

В таких ситуациях, вы, как правило, хотите создать отдельный экземпляр iCollopeView для каждого по-разному отфильтрованного использования коллекции. Это не очень хорошая идея использовать конкретную реализацию ICOLLICEVIEW, поскольку это возможно для того, чтобы выбрать тип CollectionView, необходимый для изменения, если элементыSource связаны с другим типом коллекции. Использование

 ICollectionView filteredView = new CollectionViewSource { Source=newValue }.View;

даст вам iconglecteview, который автоматически правильный тип.

К сожалению, то, что вы можете найти в этом случае, состоит в том, что очень трудно применить другую коллекцию для PerfulsPresenter вашего пользовательского контроля, поскольку все это магия сделана для вас базовым элементом Class Class и опирается на элементы / Предметы свойства, которые он управляет. Это происходит при использовании чего-то похожего на шаблон itemsControl по умолчанию.

Если вы на самом деле используете отдельный элемент управления ListBox (и Templatebinding все свойства элементовSource, если вам они нуждаются в их) Внутри вашей ControlTemplate, то вы сможете просто добавить новый iconglecteview DP (я бы порекомендовал только для чтения) Ваш элемент управления для удержания отфильтрованной версии коллекции и связывает элементы элемента «Шаблон ListBox» к этой новой собственности.

38
ответ дан 30 November 2019 в 11:12
поделиться

Проблема в том, что CollectionViewsource.getDefaultView (объект) всегда вернет один и тот же Iconglecteview экземпляр для данного источника, и это то, что любые Установка элементовControl будет использоваться при отображении этого источника.

Вы можете обойти это, создав новый экземпляр ICOLLECTIONView , который будет использоваться каждый элемент управления, который вы хотите, чтобы вы могли самостоятельно фильтровать коллекцию, а затем явно привязав к элементам Свойство каждого контроля на этот конкретный вид. Тип ICOLLICEVEWVEW необходимо будет зависеть от вашего сценария, но ListCollectionView обычно подходит.

5
ответ дан 30 November 2019 в 11:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: