WPF - фильтр CollectionViewSource не работает - PullRequest
0 голосов
/ 28 августа 2011

Я приобрел элемент управления, который позволяет выбирать несколько элементов из статьи проекта кода http://www.codeproject.com/KB/WPF/MultipleSelectionControl.aspx. В основном он имеет 2 списка. Один начинается со всех элементов, и когда пользователь выбирает некоторые из них, они перемещаются в другой список. Элемент управления определяет два свойства зависимостей для двух списков, а тот, который изначально содержит все элементы, - это AvailableItems. Он используется в ControlTemplate элемента управления следующим образом:

<ListBox
  Grid.Row="2"
  Grid.Column="0"
  SelectionMode="Extended"
  x:Name="PART_AvailableListBox"
  ItemsSource="{Binding AvailableItems}"
  ItemTemplate="{TemplateBinding ObjectsTemplate}">
  <ListBox.ItemContainerStyle>
    <Style TargetType="{x:Type ListBoxItem}">
      <EventSetter Event="MouseDoubleClick" Handler="AvailableListBoxItem_DoubleClick" />
    </Style>
  </ListBox.ItemContainerStyle>
</ListBox>

Я использую элемент управления в моем проекте как:

<Window.Resources>
  <CollectionViewSource x:Key="multiSelectDataView" Source="{Binding ElementName=DocumentRoot, Path=AllItems}" Filter="Data_Filter" />
</Window.Resources>

<UI:MultiSelectControl
  x:Name="multiSelect"
  Style="{StaticResource MultiSelectControlStyle}"
  CurrentTitle="Group Components"
  AvailableTitle="All Components"
  AvailableItems="{Binding Source={StaticResource multiSelectDataView}}"
  CurrentItems="{Binding SelectedItems, Mode=TwoWay}">
    <UI:MultiSelectControl.ObjectsTemplate>
      <DataTemplate>
        <TextBlock Text="{Binding}" />
      </DataTemplate>
    </UI:MultiSelectControl.ObjectsTemplate>
</UI:MultiSelectControl>

Я пытаюсь отфильтровать AvailableItems, привязав его к CollectionViewSource и определив функцию фильтра Data_Filter. AllItems является объектом List и содержит строки. Когда элемент управления инициализируется, Data_Filter вызывается для каждого элемента в AllItems, и для каждого элемента устанавливается правильное свойство FilterEventArgs. Однако элемент управления отображает все элементы, не относящиеся к Data_Filter. В реализации элемента управления объект ICollectionView определяется как:

this.AvailableItemsCollectionView = 
                CollectionViewSource.GetDefaultView(this.AvailableItems);

, что заставляет меня подозревать, что контроль пропускает мой взгляд. Я могу попытаться реализовать фильтрацию в реализации элемента управления, но это не очень хорошее решение. Есть предложения?

1 Ответ

0 голосов
/ 29 августа 2011

Если я правильно читаю ваши фрагменты кода, да, представление вашей коллекции никогда не используется; GetDefaultView не возвращает никаких представлений, которые были явно созданы CollectionViewSource.

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

UPDATE

Вот что вы можете попробовать:

Определите модель представления, которая предоставляет коллекцию доступных элементов, с которыми можно связать представление. Модель представления теперь будет отвечать за фильтрацию представления коллекции по умолчанию . Вам нужно решить, как запустить фильтрацию, т. Е. Через команды или установщики свойств и т. Д., Но в этом примере я покажу настройку фильтра в конструкторе модели представления:

public class MyViewModel
{
  public IList MyAvailableItems {...}

  public MyViewModel()
  {
    var defaultView = CollectionViewSource.GetDefaultView(MyAvailableItems);
    defaultView.Filter = ...
  } 
}

Причина, по которой это должно работать, заключается в том, что CollectionViewSource.GetDefaultView(...) всегда возвращает одно и то же представление. Таким образом, если элемент управления всегда запрашивает представление по умолчанию, и ваша модель представления добавила к нему фильтр, вы должны получить желаемый эффект без явного создания CollectionViewSource в XAML.

...