c# - 在 WPF 中仅使用 XAML 根据 TextBox 的文本过滤 ListBox 的项目

标签 c# .net wpf xaml

我目前有一个绑定(bind)到项目集合的列表框。由于集合很大,我们希望根据在 TextBox 上输入的文本过滤显示的项目。

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

希望它清楚,

谢谢!

最佳答案

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

It's a MVVM patter but this is a View only related problem so I don't want this code at the ViewModel.

那不是正确的方式,因为 View 只显示她得到但不应该修改的内容 所以它应该/必须是你的 ViewModel 谁处理了变化

所以现在一些代码片段:

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

Xaml 片段:

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

编辑我忘了过滤器

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

关于c# - 在 WPF 中仅使用 XAML 根据 TextBox 的文本过滤 ListBox 的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7093861/

相关文章:

c# - VB.NET 和 C# CIL 看起来一样吗?

c++ - 如何实现文件下载的暂停和恢复功能?

c# - 如何将匿名类型的 List 转换为 List<T>?

WPF 引用另一个模块、类或窗口中的文本框文本

c# - 如何使用 SWIG 生成的接口(interface)在 C# 中正确向下转换?

c# - 如何在 pinvoke 中使用 cdecl 回调

c# - 如何重构此 ForEach(..) 代码以使用 Parallel.ForEach(..)?

c# - 与 MVVM 的用户界面交互

c# - WPF 中的停靠和 anchor

c# - 如何在 DotNetNuke 中获取门户的当前登录 URL?