我有一个项目列表框和一个搜索文本框和搜索按钮,我想在文本框中输入搜索文本并单击搜索按钮,以便列表框突出显示该项目并获取它在屏幕上(用于冗长的列表)。 使用ICollectionView可以做到这一点吗?如果不可能的话如何实现这个场景。 注意:谷歌搜索后,我发现所有关于过滤的示例,但我需要搜索。 感谢您与我们联系。WPF-MVVM:使用ICollectionView搜索列表框
回答
您可以通过实现一个棱镜行为实现这一目标:
public class AutoScrollingBehavior:Behavior<ListBox>
{
protected override void OnAttached()
{
base.OnAttached();
var itemsSource = AssociatedObject.ItemsSource as ICollectionView;
if (itemsSource == null)
return;
itemsSource.CurrentChanged += ItemsSourceCurrentChanged;
}
void ItemsSourceCurrentChanged(object sender, EventArgs e)
{
AssociatedObject.ScrollIntoView(((ICollectionView)sender).CurrentItem);
AssociatedObject.Focus();
}
}
另一种方法是听ListBox.SelectionChanged而不是ICollectionView.CurrentChanged。
public class AutoScrollingBehavior:Behavior<ListBox>
{
protected override void OnAttached()
{
base.OnAttached();
AssociatedObject.SelectionChanged += AssociatedObjectSelectionChanged;
}
void AssociatedObjectSelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (e.AddedItems.Count <= 0)
return;
AssociatedObject.ScrollIntoView(e.AddedItems[0]);
AssociatedObject.Focus();
}
}
在XAML中:
<ScrollViewer Height="200">
<ListBox x:Name="listbox" ItemsSource="{Binding Path=NamesView}" SelectionMode="Single"
IsSynchronizedWithCurrentItem="True">
<i:Interaction.Behaviors>
<local:AutoScrollingBehavior/>
</i:Interaction.Behaviors>
</ListBox>
</ScrollViewer>
内搜索命令,设置NamesView.MoveCurrentTo(foundItem)
。然而,这种方法只会滚动到边缘,而不是中心,你可能会期望。如果您希望它滚动到中心,则可能需要ItemContainerGenerator
。
在谁拥有的ICollectionView的您的视图模型:
private string _searchText;
public string SearchText
{
get { return _searchText; }
set
{
_searchText = value;
RaisePropertyChanged("SearchText");
}
}
private ICommand _searchCommand;
public ICommand SearchCommand
{
get { return _searchCommand ?? (_searchCommand = new DelegateCommand(Search)); }
}
private void Search()
{
var item = _names.FirstOrDefault(name => name == SearchText);
if (item == null) return;
NamesView.MoveCurrentTo(item);
}
在XAML中,绑定TextBox.Text到SEARCHTEXT并结合搜索按钮的命令来SearchCommand。
希望它可以帮助。
它是C:\ Program Files文件(x86)\ Microsoft SDKs \ Expression \ Blend \ .NETFramework \ v4.0 \ Libraries \ System.Windows.Interactivity.dll。我编辑答案向你展示如何绑定文本。 –
var item = _names.FirstOrDefault(name => name == SearchText); 项目始终为空,并且对于(name => name == SearchText)LHS是一个对象,RHS是一个字符串 – Hussein
这只是一个示例,可告诉您解决问题的方式。在现实世界中它可能要复杂得多。例如,LHS是一个对象,那么你应该怎么做?遵循业务逻辑。如果你正在寻找他的名字,那么使用_persons.FirstOrDefault(person => person.Firstname == SearchText)等等。 –
- 1. 使用backgroundWorker在列表框中搜索
- 2. 列表框搜索功能
- 3. NotImplementedException搜索列表框
- 4. C#搜索列表框
- 5. 用wpf在列表框中搜索
- 6. vb2008通过使用文本框的列表框搜索
- 7. 使用ICollectionView
- 8. 使用一个搜索框搜索多个数据库列
- 9. 使用Android搜索对话框搜索多个数据库列
- 10. PHP使用多个文本框搜索多列的MySQL搜索
- 11. 搜索列表
- 12. 如何在列表框中搜索?
- 13. MFC组合框,搜索字体列表
- 14. 搜索面板列表框选择 -
- 15. 搜索根据列表框选择
- 16. 通过HABTM复选框/列表搜索
- 17. 如何使用LWUIT显示对话框与搜索列表?
- 18. 使用Android中的搜索框创建多选列表视图
- 19. 如何使用文本框搜索并提供建议列表?
- 20. 使用大写和小写在列表框中搜索项目
- 21. c# - 使用文本框搜索列表视图项目
- 22. 使用快速搜索框即时搜索Android搜索
- 23. 搜索列表的列表?
- 24. 如何使用搜索框
- 25. 如何使用android搜索搜索数组列表?
- 26. 使用二进制搜索(C#)搜索分类列表
- 27. 使用BaseAdapter的ListView搜索功能不填充搜索列表
- 28. PHP:使用下拉列表搜索
- 29. 使用ThreadPools搜索对象列表
- 30. SQL - SSRS搜索值列表使用LIKE
是的,这是可能的,并过滤收集视图是一个首选的解决方案。虽然它说'过滤',但您可以用'搜索和选择'来代替它。 –
@GarryVass我知道如何使用ICollectionView进行过滤以便搜索和突出显示所需项目的步骤 – Hussein
突出显示在视觉方面,其实现可以使用ICollectionView,但视觉效果需要模板或其他实现。两种不同的动物类型的东西。 –