2013-06-13 29 views
5

Ich habe ein Textfeld und ein Datagrid. Das Datagrid hat zwei Spalten Name und E-Mail-Adresse. Ich möchte die DataGrid-Werte mit dem Wert in der Textbox filtern. enter image description hereFilter WPF DataGrid-Werte aus einem Textfeld

+0

von welcher Spalte, Namen oder E-Mail? Und verwenden Sie MVVM Design Pattern hier? – Colin

+0

@Colin, wie man das in MVVM macht – Mussammil

Antwort

22

Sie können eine ICollectionView für die DataGridItemSource verwenden, dann können Sie ein Filter Prädikat anwenden und die Liste refesh bei Bedarf.

Hier ist ein sehr schnelles Beispiel.

XAML:

<Window x:Class="WpfApplication10.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="188" Width="288" Name="UI" > 
    <StackPanel DataContext="{Binding ElementName=UI}"> 
     <TextBox Text="{Binding FilterString, UpdateSourceTrigger=PropertyChanged}" /> 
     <DataGrid ItemsSource="{Binding DataGridCollection}" /> 
    </StackPanel> 
</Window> 

Code:

namespace WpfApplication10 
{ 
    public partial class MainWindow : Window, INotifyPropertyChanged 
    { 
     private ICollectionView _dataGridCollection; 
     private string _filterString; 

     public MainWindow() 
     { 
      InitializeComponent(); 
      DataGridCollection = CollectionViewSource.GetDefaultView(TestData); 
      DataGridCollection.Filter = new Predicate<object>(Filter); 
     } 

     public ICollectionView DataGridCollection 
     { 
      get { return _dataGridCollection; } 
      set { _dataGridCollection = value; NotifyPropertyChanged("DataGridCollection"); } 
     } 

     public string FilterString 
     { 
      get { return _filterString; } 
      set 
      { 
       _filterString = value; 
       NotifyPropertyChanged("FilterString"); 
       FilterCollection(); 
      } 
     } 

     private void FilterCollection() 
     { 
      if (_dataGridCollection != null) 
      { 
       _dataGridCollection.Refresh(); 
      } 
     } 

     public bool Filter(object obj) 
     { 
      var data = obj as TestClass; 
      if (data != null) 
      { 
       if (!string.IsNullOrEmpty(_filterString)) 
       { 
        return data.Name.Contains(_filterString) || data.Email.Contains(_filterString); 
       } 
       return true; 
      } 
      return false; 
     } 

     public IEnumerable<TestClass> TestData 
     { 
      get 
      { 
       yield return new TestClass { Name = "1", Email = "[email protected]" }; 
       yield return new TestClass { Name = "2", Email = "[email protected]" }; 
       yield return new TestClass { Name = "3", Email = "[email protected]" }; 
       yield return new TestClass { Name = "4", Email = "[email protected]" }; 
       yield return new TestClass { Name = "5", Email = "[email protected]" }; 
       yield return new TestClass { Name = "6", Email = "[email protected]" }; 
       yield return new TestClass { Name = "7", Email = "[email protected]" }; 
      } 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 
     private void NotifyPropertyChanged(string property) 
     { 
      if (PropertyChanged != null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs(property)); 
      } 
     } 
    } 

    public class TestClass 
    { 
     public string Name { get; set; } 
     public string Email { get; set; } 
    } 
} 

Ergebnis:

enter image description hereenter image description here

+0

Können wir das in mvvm tun – Mussammil

+0

Bitte siehe auch http://msdn.microsoft.com/de-de/library/ff407126(v=vs.110).aspx – peter70