2

感谢您阅读我的问题。

情况:

我有一个ObservableCollection<CheckableListItem<T>> CheckableItems

该类CheckableListItem<T>有 2 个元素:bool IsCheckedT 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 的对象。

我认为最好将文本绑定到我的数据上下文中的字符串变量,并在每次字符串更改时触发一个事件,如下所示:

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>

欢迎任何意见。提前致谢。

4

2 回答 2

2

您可以绑定ObservableCollectionICollectionView.

这将允许您设置一个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 );
}
于 2013-09-10T11:36:40.640 回答
1

。经过更多研究后,我提出了以下解决方案:

感谢 Paul 为我指明了正确的方向。

资料来源: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;
        }
于 2013-09-10T16:40:16.003 回答