如何根据搜索字符串显示列表框中observablecollection的对象?

时间:2013-09-10 11:11:59

标签: c# wpf xaml search listbox

感谢您阅读我的问题。

情况:

我有ObservableCollection<CheckableListItem<T>> CheckableItems

课程CheckableListItem<T>有2个元素:bool IsCheckedT 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>

欢迎任何输入。提前致谢。

2 个答案:

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