2

我在 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
    }
}
4

2 回答 2

3

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

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

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

于 2013-04-09T11:15:37.057 回答
2

有了这个

 public ICollectionView FilteredUsers
        {
            get
            {
                return usercvs.View;
            }
        }
于 2013-04-09T13:55:50.993 回答