在WPF中仅使用XAML基于TextBox的文本过滤ListBox的项目

Ign*_*cia 7 .net c# wpf xaml

我目前有一个ListBox绑定到一个项目集合.由于集合很大,我们希望根据TextBox上输入的文本过滤显示的项目.

我问的是,如果只使用XAML可以实现,我不想修改项目集合,我想根据过滤器修改每个项目的可见性.

希望它清楚,

谢谢!

Cod*_*ked 6

您可以使用CollectionViewSource来应用过滤,另一个示例可以在这里这里找到.


Kar*_*ann 5

像CodeNaked和devdigital告诉你CollectionViewSource/CollectionView/ICollectionView是你的目标的关键

这是一个MVVM模式,但这是一个仅与View相关的问题,因此我不想在ViewModel上使用此代码.

这不是正确的方式,因为View只显示她得到的但不应该修改所以它应该/必须是你的ViewModel handel更改

所以现在一些代码剪断:

    public class myVM
    {
        public CollectionViewSource CollViewSource { get; set; }
        public string SearchFilter
        {
            get;
            set
            {
              if(!string.IsNullOrEmpty(SearchFilter))
                 AddFilter();

                CollViewSource.View.Refresh(); // important to refresh your View
            }
        }
        public myVM(YourCollection)
        {
            CollViewSource = new CollectionViewSource();//onload of your VM class
            CollViewSource.Source = YourCollection;//after ini YourCollection
        }
    }
Run Code Online (Sandbox Code Playgroud)

Xaml Snip:

    <StackPanel>
        <TextBox Height="23" HorizontalAlignment="Left"  Name="tB" VerticalAlignment="Top" 
                 Width="120" Text="{Binding SearchFilter,UpdateSourceTrigger=PropertyChanged}" />
        <DataGrid Name="testgrid" ItemsSource="{Binding CollViewSource.View}"/>
    </StackPanel>
Run Code Online (Sandbox Code Playgroud)

编辑我忘了过滤器

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

}

private void Filter(object sender, FilterEventArgs e)
{
    // see Notes on Filter Methods:
    var src = e.Item as YourCollectionItemTyp;
    if (src == null)
        e.Accepted = false;
    else if ( src.FirstName !=null && !src.FirstName.Contains(SearchFilter))// here is FirstName a Property in my YourCollectionItem
        e.Accepted = false;
}
Run Code Online (Sandbox Code Playgroud)