我有一个项目列表框和一个搜索文本框和搜索按钮,我想在文本框中输入搜索文本并单击搜索按钮,以便列表框突出显示该项目并将其显示在屏幕上(对于冗长的列表)。是否可以使用 ICollectionView 做到这一点?如果不可能,如何实现这种情况。注意:谷歌搜索后,我发现所有样本都在谈论过滤,但我需要搜索。感谢您与我们相处。
问问题
1121 次
1 回答
0
您可以通过实现 Prism Behavior 来实现:
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 并将搜索按钮的 Command 绑定到 SearchCommand。
希望它可以提供帮助。
于 2013-08-05T18:18:12.057 回答