首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在WPF中仅使用XAML根据ListBox的文本筛选TextBox项

在WPF中仅使用XAML根据ListBox的文本筛选TextBox项
EN

Stack Overflow用户
提问于 2011-08-17 21:42:39
回答 6查看 20.5K关注 0票数 7

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

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

希望天气晴朗,

谢谢!

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-08-17 21:47:12

您可以使用CollectionViewSource来应用过滤,另一个示例可以在herehere中找到。

票数 5
EN

Stack Overflow用户

发布于 2012-11-07 18:53:05

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

,这是一个MVVM模式,但这是一个仅与查看相关的问题,所以我不想在ViewModel上看到这段代码。

这不是正确的方式,因为视图只显示她得到了什么,而不应该修改,所以应该/必须是你的ViewModel更改

所以现在来看一些代码片段:

代码语言:javascript
复制
    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片段:

代码语言:javascript
复制
    <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>

编辑我忘记了过滤器

代码语言:javascript
复制
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;
}
票数 5
EN

Stack Overflow用户

发布于 2011-08-17 21:49:53

您可以使用CollectionViewSource来完成此操作。您不希望完全在XAML中执行此操作,因为如果过滤代码位于视图模型中(假设使用MVVM设计模式),则测试此操作会容易得多。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7093861

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档