感谢您阅读我的问题。
情况:
我有ObservableCollection<CheckableListItem<T>> CheckableItems
课程CheckableListItem<T>
有2个元素:bool IsChecked
和T Item
。
该类充当包装类,为每个Item添加一个复选框。 在这个项目中,Item传递了一个名为Name的字符串元素。
如何在XAML代码中显示:
<ListBox ItemsSource="{Binding CheckableItems}">
<ListBox.ItemTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding IsChecked, Mode=TwoWay}" Content="{Binding Path=Item.Name}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
这为我提供了一个列表框,每个条目都包含一个复选框,复选框的内容是Item.Name字符串。
问题:
我在XAML <TextBox></TextBox>
中添加了一个文本框现在我希望列表框只显示可观察集合中与TextBox中的文本匹配的对象。
我认为可以做到这一点:
创建某种类型的视图以绑定到列表框,并仅使用与搜索条件匹配的对象更新视图。如果在搜索框中未输入任何文本,则必须显示所有对象。如果仅输入字母E,则仅显示Item.Name属性中包含字母E的对象。
我认为最好将文本绑定到我的datacontext中的字符串变量,并在每次字符串更改时触发事件,如下所示:
string SearchString
<TextBox Text="{Binding Path=SearchString, UpdateSourceTrigger=PropertyChanged}" TextChanged="TextBox_TextChanged" />
功能:
private void TextBox_TextChanged(object sender, System.Windows.Controls.TextChangedEventArgs e)
{
// Called each time the text changes, perform search here?
}
我只是缺乏WPF语法的知识,如何创建这个或如何谷歌正确的术语。
修改
我现在有ICollectionView checkableItemsView
ObservableCollection<CheckableListItem<T>> CheckableItems
但是如何在Item.Name属性上过滤它?
绑定有效,只需要我需要帮助的过滤:
<ListBox Grid.Column="1" ItemsSource="{Binding CheckableItemView}">
<ListBox.ItemTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding IsChecked, Mode=TwoWay}" Content="{Binding Path=Item.Name}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
欢迎任何输入。提前致谢。
答案 0 :(得分:2)
您可以绑定到ObservableCollection
,而不是直接绑定到ICollectionView
。
这将允许您设置Filter
属性(使用谓词),该属性将过滤UI级别的条目,而不更改基础集合。
看一下本页的过滤部分: http://wpftutorial.net/DataViews.html
编辑以添加过滤示例:
ICollectionView _customerView = CollectionViewSource.GetDefaultView(customers);
_customerView.Filter = CustomerFilter
private bool CustomerFilter(object item)
{
Customer customer = item as Customer;
return customer.Name.Contains( _searchString );
}
答案 1 :(得分:1)
。经过一些研究后,我得到了以下解决方案:
致信保罗指出我正确的方向。
来源:http://jacobmsaylor.com/?p=1270
private bool CustomFilter(object item)
{
CheckableListItem<Item> checkableItem = item as CheckableListItem<Item>;
if (checkableItem != null && checkableItem.Item.Name.Contains(SearchString))
{
return true;
}
return false;
}
private void TextBox_TextChanged(object sender, System.Windows.Controls.TextChangedEventArgs e)
{
checkableItemsView.Filter = CustomFilter;
}