0

我有一个项目列表框和一个搜索文本框和搜索按钮,我想在文本框中输入搜索文本并单击搜索按钮,以便列表框突出显示该项目并将其显示在屏幕上(对于冗长的列表)。是否可以使用 ICollectionView 做到这一点?如果不可能,如何实现这种情况。注意:谷歌搜索后,我发现所有样本都在谈论过滤,但我需要搜索。感谢您与我们相处。

4

1 回答 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 回答