Коллекция ViewSource для фильтрации списка, введя текстовое поле

У меня есть список в WPF, в котором перечислены имя и фамилия пользователей. У меня есть текстовое поле, и я пытаюсь фильтровать по именам. Вот что я пытаюсь: (ничего не фильтруется, когда я печатаю в текстовом поле)

Вот моя ВМ

        #region Members

        private CollectionViewSource usercvs = new CollectionViewSource();
        private string searchString;

        #endregion

        #region Properties

        public string SearchFilter
        {
            get
            {
                return this.searchString;
            }

            set
            {
                if (!string.IsNullOrEmpty(this.searchString))
                    AddFilter();

                usercvs.View.Refresh();    
                this.searchString = value;
            }
        }

        #endregion

        #region Methods

        private void AddFilter()
        {
            usercvs.Filter -= new FilterEventHandler(Filter);
            usercvs.Filter += new FilterEventHandler(Filter);

        }

        private void Filter(object sender, FilterEventArgs e)
        {
            // see Notes on Filter Methods:
            var src = e.Item as User;
            if (src == null)
                e.Accepted = false;
            else if (src.LastName != null && !src.LastName.Contains(SearchFilter))
                e.Accepted = false;
        }

        #endregion
    }
}

person KeyboardFriendly    schedule 09.04.2013    source источник
comment
Привязывается ли ваш ListBox к свойству Users (ObservableCollection)?   -  person Jehof    schedule 09.04.2013
comment
Да, это так, извините, я должен поместить xaml списка в код. Я обновлю код.   -  person KeyboardFriendly    schedule 09.04.2013


Ответы (2)


Добавьте в ViewModel дополнительное свойство, которое предоставляет CollectionViewSource, и привяжите свой ListBox к этому свойству.

public CollectionViewSource FilteredUsers{
  get {
    return usercvs.View;
  }
}

ObservableCollection не изменяется, когда вы применяете какие-либо фильтры к CollectionViewSource, так что вы всегда будете видеть все элементы. Фильтр применяется к CollectionViewSource, и к отфильтрованному результату можно получить доступ с помощью свойства View класса.

person Jehof    schedule 09.04.2013
comment
Я создал свойство, и когда я устанавливаю привязку списка к свойству, ничего не возвращается, но когда я устанавливаю точки останова в методах фильтра, данные отображаются. - person KeyboardFriendly; 09.04.2013

Получил это с этим

 public ICollectionView FilteredUsers
        {
            get
            {
                return usercvs.View;
            }
        }
person KeyboardFriendly    schedule 09.04.2013
comment
да это правильно. Я забыл вернуть представление CollectionViewSource - person Jehof; 09.04.2013