WPF - фильтрация / поиск нескольких представлений коллекции в древовидной структуре - PullRequest
2 голосов
/ 06 октября 2009

У меня есть древовидное представление, которое связано с коллекцией, и каждый элемент в коллекции связан с другой коллекцией. (используя шаблоны данных hierachle)

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

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

1 Ответ

3 голосов
/ 03 ноября 2009

Самый простой способ сделать это - создать свойство SearchFilter

     public string SearchFilter
    {
        get { return _searchFilter; }
        set
        {
            _searchFilter = value;
            OnPropertyChanged("MyTreeViewBoundCollection");
        }
    }

Вы связываете поисковый фильтр с текстовым полем, и каждый раз, когда изменяется текстовое поле поиска, вы уведомляете, что коллекция изменилась

            <TextBox Text="{Binding Path=TemplateDataSchema.SearchFilter, UpdateSourceTrigger=PropertyChanged}"/>

Как только изменение произошло в SearchFilter, система привязки WPF запросит свойство Collection, которое затем можно отфильтровать

 public ObservableCollection<Category> MyTreeViewBoundCollection
    {
        get {
            if (_searchFilter.Trim().Length < 1)
                return myObject.Categories;
            else
            {
                ObservableCollection<Category> cats = new ObservableCollection<Category>();
                string searchText = _searchFilter.ToLower().Trim();
                foreach (Category cat in myObject.Categories)
                {
                    Category tmpCat = new Category(cat.CategoryName);
                    foreach (Field field in cat.Fields)
                    {
                        if (field.DataDisplayName.ToLower().Contains(searchText))
                            tmpCat.Fields.Add(field);
                    }
                    if (tmpCat.Fields.Count > 0)
                        cats.Add(tmpCat);
                }

                return cats;
            }
        }
    }

Это вернет только коллекцию фильтров.

...