2013-08-05 58 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)等等。 –