2015-11-02 86 views
0

我有一個文本框和一個列表框隱藏ListBoxItems不工作

<TextBox FontSize="12pt" Text="{Binding NameFilter, UpdateSourceTrigger=PropertyChanged}" /> 

<ListBox x:Name="EmployeeList" ItemsSource="{Binding EmployeeList}"> 
    <ListBox.ItemContainerStyle> 
     <Style TargetType="{x:Type ListBoxItem}"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding IsVisible}" Value="False"> 
        <Setter Property="Visibility" Value="Collapsed"/> 
       </DataTrigger> 
       <DataTrigger Binding="{Binding IsVisible}" Value="True"> 
        <Setter Property="Visibility" Value="Visible"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </ListBox.ItemContainerStyle> 
</ListBox> 

物業我的視圖模型的

public string NameFilter 
{ 
    get { return _nameFilter; } 
    set { 
     _nameFilter = value; 
     FilterEmployees(); 
    } 
} 

FilterEmployees設置每個員工的屬性IsVisible爲true或false。

我有兩個問題:

1) 我二傳手獲取每個用戶輸入後打來電話,我得到EmployeeList的過濾。

​​

獲得呼叫。但是我看不到我的清單更新。

2.) 當我手動更新我的列表(通過另一個函數)項目消失。但他們永遠不會重蹈覆轍。當輸入字符串爲空(在調試器中檢查它)時,我的過濾器將所有內容設置爲IsVisible = true。但不會發生UI更新。

我錯過了什麼?我用這個答案,但是這似乎不是我的問題,因爲它的工作原理,如果我觸發我的計劃內的另一個動作是更新列表: WPF - hiding listbox items

編輯: 我整理我的項目(實際移動它們裏面的ObsservableCollection)。通過這種方式可以看到變化(員工被隱藏)。但這只是隱藏起來,他們從不收割。

看起來好像整個東西被觸發得晚了。我只想要名字中帶有「m」的員工。我必須手動刷新列表兩次。有時候還剩下一些用戶,他們的名字中沒有「m」。

+0

發佈'FilterEmployees()',這樣我們就可以看到你在做什麼。另外,還有一些更好的過濾方法,例如使用Reactive(Rx),他們有很好的過濾教程。 – Kcvin

回答

1

您可以通過CollectionView過濾List的綁定集合。您的實現可以如下所示:獲取ListView的ItemsSource的CollectionView並定義過濾器委託。使用CollectionView和Filter,您不更新實際的ItemSource,而是根據過濾器謂詞放置要顯示的內容的過濾器。

private void FilterEmployees() 
     { 
      ICollectionView items = CollectionViewSource.GetDefaultView(EmployeeList); 
      if (items != null) 
      { 
       items.Filter = SearchFilter; 
      } 
     } 

可以存儲爲的CollectionView成員變量,這樣你就不需要再得到的CollectionView和再次

public bool SearchFilter(object filterObject) 
     { 
      var filter = filterObject as <<List Box item type>>; 
      if (filter == null) 
      { 
       return false; 
      } 

      <<Your search logic here.......>>   
} 

而且,EmployeeList的類型應該是的ObservableCollection我在發現你的編輯你做到了。

現在,這裏的問題關於---您是否必須搜索每個關鍵筆劃或要延遲搜索,以便它允許用戶輸入。所以要實現這個,你可以創建一個attach/dependency屬性來定義一個延遲,以便在定義的持續時間後調用搜索函數。您已遵循link中提到的方法。

+0

哇!這使事情變得非常簡單!非常感謝您使用CollectionView的提示。奇蹟般有效。在每個KeyStroke上搜索都很好(我在列表中只有15-20個對象)。 – DoubleVoid