关于这个问题的简短背景:我正在研究WPF应用程序的UI部分。但由于我已经完成了我的部分相当快-决定尝试实现ListBox过滤功能。
我现在所拥有的是:
<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/
以下是密码:
<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>这是反码:
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没有被用户代码处理。附加信息:对象引用没有设置为对象的实例。“
发布于 2016-07-11 21:52:17
好的,我已经做了一个稳定的工作原型描述的目的。我遵循这个例子:http://www.wpf-tutorial.com/listview-control/listview-filtering/,唯一的区别是我的ItemsSource被放置在外面。
以下是工作代码(简化)。
XAML:
<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:
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以下是三个值得注意的要点:
不是最好的风格,而是工作风格。
https://stackoverflow.com/questions/38257188
复制相似问题