首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ListBox的实时滤波

ListBox的实时滤波
EN

Stack Overflow用户
提问于 2016-07-08 00:14:51
回答 1查看 1.9K关注 0票数 0

关于这个问题的简短背景:我正在研究WPF应用程序的UI部分。但由于我已经完成了我的部分相当快-决定尝试实现ListBox过滤功能。

我现在所拥有的是:

代码语言:javascript
复制
    <TextBox Style="{StaticResource WaterMarkMessageTextBoxStyle}" 
             x:Name="usuariosDisponiblesSearch" 
             Grid.Column="1" Grid.Row="1"/>
    <ListBox Style="{StaticResource ListBoxTable}" 
             ItemContainerStyle="{StaticResource AlternatingListViewItemStyle}"                 
             AlternationCount="2" 
             Grid.Column="1" Grid.Row="2" 
             x:Name="lbPossibleContracts" 
             SelectionChanged="lbPossibleContracts_SelectionChanged" >
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding Path=Nombre}" />
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

TextBox包含一个搜索字符串。ListBox --按字段名从DB中提取的数据。

在结束点-我希望有工作过滤器,它只显示在ListBox中的项目,这与TextBox中的字符串匹配。实时的。

当然,我理解如果不修改back代码是不可能做到的。

问题是,到目前为止,我实现过滤功能的方法没有成功,主要是因为我不知道我到底要在后面的代码中实现什么。

如对此有任何帮助,将不胜感激。在任何方向工作--如果您想要生成代码( :)的整个部分--您是受欢迎的,如果您有一些好的、可以理解的引用--一个平等的、已解决的问题-it也很棒。

更新

好吧,我在这个问题上取得了很大的进步。

我遵循这个例子:http://www.wpf-tutorial.com/listview-control/listview-filtering/

以下是密码:

代码语言:javascript
复制
        <TextBox Style="{StaticResource WaterMarkMessageTextBoxStyle}" 
             x:Name="usuariosDisponiblesSearch" 
             Grid.Column="1" Grid.Row="1" 
             TextChanged="usuariosDisponiblesSearch_TextChanged" />
        <ListBox  Style="{StaticResource ListBoxTable}"
              ItemContainerStyle="{StaticResource AlternatingListViewItemStyle}"
              AlternationCount="2"
              Margin="0,20,0,0"
              x:Name="lbPossibleContractsFilter" 
              SelectionChanged="lbPossibleContracts_SelectionChanged" >
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="{Binding Path=Nombre}" />
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

这是反码:

代码语言:javascript
复制
public partial class ProjectAssignUsuariosView : UserControl
{
    private ProjectAssignUsuariosViewModel _viewModel;



    public ProjectAssignUsuariosView(Proyecto proyecto)
    {
        InitializeComponent();

        _viewModel = new ProjectAssignUsuariosViewModel(proyecto);

        //TempFilterPart
        lbPossibleContractsFilter.ItemsSource = _viewModel.UsuariosLibres;
        List<Usuario> items = new List<Usuario>();
        filteredUsers.ItemsSource = items;
        CollectionView view = (CollectionView)CollectionViewSource.GetDefaultView(lbPossibleContractsFilter.ItemsSource);
        view.Filter = UserFilter;
        //Filtering part ends
    }

    //Filtering
    private bool UserFilter(object item)
    {
        if (String.IsNullOrEmpty(usuariosDisponiblesSearch.Text))
            return true;
        else
            return ((item as Usuario).Nombre.IndexOf(usuariosDisponiblesSearch.Text, StringComparison.OrdinalIgnoreCase) >= 0);
    }


    private void usuariosDisponiblesSearch_TextChanged(object sender, TextChangedEventArgs e)
    {
        CollectionViewSource.GetDefaultView(lbPossibleContractsFilter.ItemsSource).Refresh();
    }
    //Filtering ends

编译时没有错误。但是在运行和更改TextBox时-引发意外的应用程序错误。调试器说:"NullReferenceException没有被用户代码处理。附加信息:对象引用没有设置为对象的实例。“

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-11 21:52:17

好的,我已经做了一个稳定的工作原型描述的目的。我遵循这个例子:http://www.wpf-tutorial.com/listview-control/listview-filtering/,唯一的区别是我的ItemsSource被放置在外面。

以下是工作代码(简化)。

XAML:

代码语言:javascript
复制
<ListBox Style="{StaticResource ListBoxTable}" 
             ItemContainerStyle="{StaticResource AlternatingListViewItemStyle}"                 
             AlternationCount="2" 
             Grid.Column="1" Grid.Row="2" 
             x:Name="lbPossibleContracts" 
             SelectionChanged="lbPossibleContracts_SelectionChanged" >
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding Path=Nombre}" />
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

这里的重要部分是ListBox x:Name属性,它允许访问ItemsSource。以及要求刷新结果的ListBox SelectionChanged Propert。

XAML.CS:

代码语言:javascript
复制
namespace Todiste.Views.Proyectos
{
public partial class ProjectAssignUsuariosView : UserControl
{
    private ProjectAssignUsuariosViewModel _viewModel;
    public ProjectAssignUsuariosView(Proyecto proyecto)
    {
        InitializeComponent();

        _viewModel = new ProjectAssignUsuariosViewModel(proyecto);

        lbCurrentContracts.ItemsSource = _viewModel.UsuariosProyecto;
        lbPossibleContracts.ItemsSource = _viewModel.UsuariosLibres;
        //Filter Starts            
        CollectionView view = (CollectionView)CollectionViewSource.GetDefaultView(lbPossibleContracts.ItemsSource);
        view.Filter = UserFilter;
        //Filter Ends
    }

    //Filter Starts
    private bool UserFilter(object item)
    {
        if (string.IsNullOrEmpty(filter.Text))
            return true;
        else
            return ((item as Usuario).Nombre.IndexOf(filter.Text, StringComparison.OrdinalIgnoreCase) >= 0);
    }

    private void filter_TextChanged(object sender, TextChangedEventArgs e)
    {
        CollectionViewSource.GetDefaultView(lbPossibleContracts.ItemsSource).Refresh();
    }
    // Filter Ends

以下是三个值得注意的要点:

  1. lbPossibleContracts.ItemsSource = _viewModel.UsuariosLibres;-将外部数据源分配给列表
  2. 集合视图=-定义视图
  3. UserFilter和filter_TextChanged -实际上是执行过滤和列表刷新操作的函数。

不是最好的风格,而是工作风格。

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

https://stackoverflow.com/questions/38257188

复制
相关文章

相似问题

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