2013-03-12 4 views
8

ListBoxに文字列のリストをロードしましたが、今度はTextBoxにテキストを入力するときにフィルタリングします。どうしたらいいですか?私はXAMLでそれを結合していWPF ListBoxをフィルタする

public void ListLoad() 
{ 
    ElementList = new List<string>(); // creation a list of strings 
    ElementList.Add("1"); // add a item of string 
    ElementList.Add("2"); // add a item of string 

    DataContext = this; // set the data context 
} 

のItemsSource = "{バインディングElementList}"

答えて

23

CollectionViewSourceクラスはここに助けることができます。私が言う限りでは、コレクションをフィルタリング、ソート、グループ化するための多くの機能があります。

ICollectionView view = CollectionViewSource.GetDefaultView(ElementList); 
view.Filter = (o) => {return o;}//here is the lambda with your conditions to filter 

あなただけnullview.Filterを設定する任意のフィルタを必要としません。あなたが並べ替えるには、以下のコードを使用してリストボックスにitemsourceとして辞書を設定した場合 も

private void tb_filter_textChanged(object sender, TextChangedEventArgs e) 
    { 
     Dictionary<string, string> dictObject = new Dictionary<string, string>(); 
     ICollectionView view = CollectionViewSource.GetDefaultView(dictObject); 
     view.Filter = CustomerFilter; 
     listboxname.ItemsSource = view; 
    } 

    private bool CustomerFilter(object item) 
    { 
     KeyValuePair<string, string> Items = (KeyValuePair<string,string>) item; 
     return Items.Value.ToString().Contains("a"); 
    } 

上記のコードは「A」をcontaningアイテムを返し、filtering

0

でこの記事をチェックしてください。ここで

7

は、フィルタを結合するための添付プロパティである:

XAMLでこのように使用
using System; 
using System.Windows; 
using System.Windows.Controls; 

public static class Filter 
{ 
    public static readonly DependencyProperty ByProperty = DependencyProperty.RegisterAttached(
     "By", 
     typeof(Predicate<object>), 
     typeof(Filter), 
     new PropertyMetadata(default(Predicate<object>), OnWithChanged)); 

    public static void SetBy(ItemsControl element, Predicate<object> value) 
    { 
     element.SetValue(ByProperty, value); 
    } 

    public static Predicate<object> GetBy(ItemsControl element) 
    { 
     return (Predicate<object>)element.GetValue(ByProperty); 
    } 

    private static void OnWithChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     UpdateFilter((ItemsControl)d, (Predicate<object>)e.NewValue); 
    } 

    private static void UpdateFilter(ItemsControl itemsControl, Predicate<object> filter) 
    { 
     if (itemsControl.Items.CanFilter) 
     { 
      itemsControl.Items.Filter = filter; 
     } 
    } 
} 

<DataGrid local:Filter.By="{Binding Filter}" 
      ItemsSource="{Binding Foos}"> 
    ... 

とのviewmodel:

public class ViewModel : INotifyPropertyChanged 
{ 
    private string filterText; 
    private Predicate<object> filter; 

    public event PropertyChangedEventHandler PropertyChanged; 

    public ObservableCollection<Foo> Foos { get; } = new ObservableCollection<Foo>(); 

    public string FilterText 
    { 
     get { return this.filterText; } 
     set 
     { 
      if (value == this.filterText) return; 
      this.filterText = value; 
      this.OnPropertyChanged(); 
      this.Filter = string.IsNullOrEmpty(this.filterText) ? (Predicate<object>)null : this.IsMatch; 
     } 
    } 

    public Predicate<object> Filter 
    { 
     get { return this.filter; } 
     private set 
     { 
      this.filter = value; 
      this.OnPropertyChanged(); 
     } 
    } 

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 

    private bool IsMatch(object item) 
    { 
     return IsMatch((Foo)item, this.filterText); 
    } 

    private static bool IsMatch(Foo item, string filterText) 
    { 
     if (string.IsNullOrEmpty(filterText)) 
     { 
      return true; 
     } 

     var name = item.Name; 
     if (string.IsNullOrEmpty(name)) 
     { 
      return false; 
     } 

     if (filterText.Length == 1) 
     { 
      return name.StartsWith(filterText, StringComparison.OrdinalIgnoreCase); 
     } 

     return name.IndexOf(filterText, 0, StringComparison.OrdinalIgnoreCase) >= 0; 
    } 
} 
関連する問題