Для дальнейшего изучения возможностей библиотеки ItemsFilter необходимо небольшое пояснение. Центральный класс библиотеки, FilterPresenter, равно как и модели фильтров Filter(s), которые он применяет для фильтрации, не взаимодействуют с DataGrid, ItemsSelector или ItemsControl. Вместо этого, они работают с представлением коллекции, подключенным к экземпляру FilterPresenter при его создании. А уж представление коллекции мы можем использовать там, где нам необходимо – возможно, во множестве мест одновременно. Если при инициализации FilterPresenter мы передаем не представление коллекции, а непосредственно саму коллекцию, то используется экземпляр представления коллекции по умолчанию (и он един для данного экземпляра коллекции во всем приложении). Аналогичным образом подключают коллекцию элементы управления, производные от ItemsControl, при установке свойства ItemsSource. Таким образом, для взаимодействия FilterView и ItemsControl достаточно, чтобы они оба были подключены к одному экземпляру коллекции (или к одному представлению коллекции).

В форме ProductsView элемент управления CategoryFilterView находится вне DataGrid, но управляет отображением коллекции, которую выводит DataGrid.

How use.

ProductsView.xaml
...
    <DataGrid x:Name="productDataGrid"
                 ItemsSource="{Binding Path=Products,
                                    Source={StaticResource Workspace}}">
...
CategoryFilterView.xaml.cs
publicpartialclassCategoryFilterView : MultiValueFilterView {
    public CategoryFilterView() {
        InitializeComponent();
        // Define Filter that must be use.
        EqualFilterInitializer initializer = newEqualFilterInitializer();
        // // Get FilterPresenter that connected to the same collection Workspace.This.Products.
        FilterPresenter productsCollectionViewFilterPresenter = FilterPresenter.TryGet(Workspace.This.Products);
        // Get EqualFilter that use Category item property.
        EqualFilter filter = ((EqualFilter)(productsCollectionViewFilterPresenter.TryGetFilter("Category", initializer)));
        // Use instance of EqualFilter as Model.
        Model = filter;
    }
}

 

How work.

Экземпляр FilterPresenter всегда привязан к представлению коллекции, для которого он создан. Поскольку в свойстве DataGrid.ItemsSource мы указываем непосредственно на саму коллекцию, DataGrid извлекает и использует представление коллекции по умолчанию. При получении экземпляра FilterPresenter в вызов FilterPresenter.TryGet(Workspace.This.Products) также передается непосредственно коллекция, и привязка происходит к тому же самому экземпляру представления коллекции по умолчанию. По сути дела, CategoryFilterView может находиться даже в отдельном окне – фильтрация представления коллекции влияет на все элементы, использующие это представление.

В форме OrdersView в раскрывающемся списке выбора Product используется экземпляр коллекции Workspace.This.Products, к которому привязан и ProductsView, поэтому при активном фильтре в форме ProductsView в режиме редактирования ячейки Product формы OrdersView в ниспадающем списке элемента управления ComboBox отображаются только отфильтрованные элементы. Например, для состояния фильтра, приведенного в предыдущей теме, вид ниспадающего списка будет такой:

Pic6

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

Last edited Nov 8, 2013 at 6:27 PM by Mishkin, version 4