我有一个文本框和一个ListBox
<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的属性
public string NameFilter
{
get { return _nameFilter; }
set {
_nameFilter = value;
FilterEmployees();
}
}FilterEmployees将每个员工的属性IsVisible设置为true或false。
我有两个问题:
1.)我的设置器在每个用户输入之后被调用,我的EmployeeList被过滤。
this.RaisePropertyChanged(() => this.EmployeeList);会被打电话。但我没有看到我的名单上的任何更新。
2.)当我手动更新我的列表时(通过另一个函数),项目就会消失。但他们从来没有收获过。当输入字符串为空(在调试器中选中)时,我的过滤器将所有内容设置为IsVisible=true。但UI更新不会发生。
我遗漏了什么?!我使用了这个答案,但这似乎不是我的问题,因为如果我在我的程序中触发另一个更新列表的操作:WPF -隐藏列表框项,它就有效了。
编辑:我正在对我的项目进行排序(实际上是将它们移动到ObsservableCollection中)。这样就可以看到更改(员工是隐藏的)。但这只是对隐藏起作用,他们从不收割机。
整件事似乎都是很晚才触发的。我只想要名字里写着"m“的员工。我必须手动刷新列表两次。有时候,仍然有一些用户,他们的名字里没有"m“。
发布于 2015-11-02 18:55:44
您可以通过CollectionView筛选列表的绑定集合。您的实现可以如下所示:为ListBox的CollectionView获取ItemsSource并定义过滤器委托。使用CollectionView和Filter,您不是在更新实际的ItemSource,而是根据filter谓词为要显示的内容设置一个筛选器。
private void FilterEmployees()
{
ICollectionView items = CollectionViewSource.GetDefaultView(EmployeeList);
if (items != null)
{
items.Filter = SearchFilter;
}
}您可以将其存储为CollectionView成员变量,这样就不需要一次又一次地获取CollectionView
public bool SearchFilter(object filterObject)
{
var filter = filterObject as <<List Box item type>>;
if (filter == null)
{
return false;
}
<<Your search logic here.......>>
}而且,EmployeeList的类型应该是ObservableCollection,我在您的编辑中发现了这一点。
现在,这里的问题是--你是否必须搜索每一个键笔画,或者你想延迟搜索,这样用户就可以输入。因此,要实现这一点,您可以创建一个附加/依赖属性来定义延迟,以便在定义的持续时间之后调用搜索函数。您已经遵循了这个链接中提到的方法。
https://stackoverflow.com/questions/33483360
复制相似问题