2013-08-05 92 views
0

我有一个项目列表框和一个搜索文本框和搜索按钮,我想在文本框中输入搜索文本并单击搜索按钮,以便列表框突出显示该项目并获取它在屏幕上(用于冗长的列表)。 使用ICollectionView可以做到这一点吗?如果不可能的话如何实现这个场景。 注意:谷歌搜索后,我发现所有关于过滤的示例,但我需要搜索。 感谢您与我们联系。WPF-MVVM:使用ICollectionView搜索列表框

+1

是的,这是可能的,并过滤收集视图是一个首选的解决方案。虽然它说'过滤',但您可以用'搜索和选择'来代替它。 –

+0

@GarryVass我知道如何使用ICollectionView进行过滤以便搜索和突出显示所需项目的步骤 – Hussein

+0

突出显示在视觉方面,其实现可以使用ICollectionView,但视觉效果需要模板或其他实现。两种不同的动物类型的东西。 –

回答

0

您可以通过实现一个棱镜行为实现这一目标:

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。

希望它可以帮助。

+0

它是C:\ Program Files文件(x86)\ Microsoft SDKs \ Expression \ Blend \ .NETFramework \ v4.0 \ Libraries \ System.Windows.Interactivity.dll。我编辑答案向你展示如何绑定文本。 –

+0

var item = _names.FirstOrDefault(name => name == SearchText); 项目始终为空,并且对于(name => name == SearchText)LHS是一个对象,RHS是一个字符串 – Hussein

+0

这只是一个示例,可告诉您解决问题的方式。在现实世界中它可能要复杂得多。例如,LHS是一个对象,那么你应该怎么做?遵循业务逻辑。如果你正在寻找他的名字,那么使用_persons.FirstOrDefault(person => person.Firstname == SearchText)等等。 –