收集ViewSource以通过键入文本框来过滤列表框

时间:2013-04-09 11:11:14

标签: c# wpf textbox listbox collectionviewsource

我在WPF中有一个列表框,其中列出了用户的名字和姓氏。我有一个文本框,我试图按名称进行过滤。以下是我正在尝试的内容:(当我在文本框中输入时,没有任何内容被过滤)

这是我的VM

        #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
    }
}

2 个答案:

答案 0 :(得分:3)

向ViewModel添加一个额外的属性,公开CollectionViewSource并将ListBox绑定到该属性。

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

当您对ObservableCollection应用任何过滤器时,CollectionViewSource不会更改,因此您将始终看到所有项目。 Filter将应用于CollectionViewSource,并且可以通过类的View属性访问过滤后的结果。

答案 1 :(得分:2)

有了这个

 public ICollectionView FilteredUsers
        {
            get
            {
                return usercvs.View;
            }
        }
相关问题