首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >隐藏ListBoxItems不工作

隐藏ListBoxItems不工作
EN

Stack Overflow用户
提问于 2015-11-02 17:23:53
回答 1查看 90关注 0票数 0

我有一个文本框和一个ListBox

代码语言:javascript
复制
<TextBox FontSize="12pt" Text="{Binding NameFilter, UpdateSourceTrigger=PropertyChanged}" />

<ListBox x:Name="EmployeeList" ItemsSource="{Binding EmployeeList}">
    <ListBox.ItemContainerStyle>
        <Style TargetType="{x:Type ListBoxItem}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding IsVisible}" Value="False">
                    <Setter Property="Visibility" Value="Collapsed"/>
                </DataTrigger>
                <DataTrigger Binding="{Binding IsVisible}" Value="True">
                    <Setter Property="Visibility" Value="Visible"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ListBox.ItemContainerStyle>
</ListBox>

我的ViewModel的属性

代码语言:javascript
复制
public string NameFilter
{
    get { return _nameFilter; }
    set { 
        _nameFilter = value;
        FilterEmployees();
    }
}

FilterEmployees将每个员工的属性IsVisible设置为true或false。

我有两个问题:

1.)我的设置器在每个用户输入之后被调用,我的EmployeeList被过滤。

代码语言:javascript
复制
this.RaisePropertyChanged(() => this.EmployeeList);

会被打电话。但我没有看到我的名单上的任何更新。

2.)当我手动更新我的列表时(通过另一个函数),项目就会消失。但他们从来没有收获过。当输入字符串为空(在调试器中选中)时,我的过滤器将所有内容设置为IsVisible=true。但UI更新不会发生。

我遗漏了什么?!我使用了这个答案,但这似乎不是我的问题,因为如果我在我的程序中触发另一个更新列表的操作:WPF -隐藏列表框项,它就有效了。

编辑:我正在对我的项目进行排序(实际上是将它们移动到ObsservableCollection中)。这样就可以看到更改(员工是隐藏的)。但这只是对隐藏起作用,他们从不收割机。

整件事似乎都是很晚才触发的。我只想要名字里写着"m“的员工。我必须手动刷新列表两次。有时候,仍然有一些用户,他们的名字里没有"m“。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-02 18:55:44

您可以通过CollectionView筛选列表的绑定集合。您的实现可以如下所示:为ListBox的CollectionView获取ItemsSource并定义过滤器委托。使用CollectionView和Filter,您不是在更新实际的ItemSource,而是根据filter谓词为要显示的内容设置一个筛选器。

代码语言:javascript
复制
private void FilterEmployees()
        {
            ICollectionView items = CollectionViewSource.GetDefaultView(EmployeeList);
            if (items != null)
            {
                items.Filter = SearchFilter;
            }
        }

您可以将其存储为CollectionView成员变量,这样就不需要一次又一次地获取CollectionView

代码语言:javascript
复制
public bool SearchFilter(object filterObject)
        {
           var filter = filterObject as <<List Box item type>>;
            if (filter == null)
            {
                return false;
            }

             <<Your search logic here.......>>        
}

而且,EmployeeList的类型应该是ObservableCollection,我在您的编辑中发现了这一点。

现在,这里的问题是--你是否必须搜索每一个键笔画,或者你想延迟搜索,这样用户就可以输入。因此,要实现这一点,您可以创建一个附加/依赖属性来定义延迟,以便在定义的持续时间之后调用搜索函数。您已经遵循了这个链接中提到的方法。

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

https://stackoverflow.com/questions/33483360

复制
相关文章

相似问题

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