2013-06-13 3 views
5

텍스트 상자와 Datagrid가 있습니다. DataGrid에는 name 및 Email 주소라는 두 개의 열이 있습니다. 텍스트 상자의 값으로 DataGrid 값을 필터링하고 싶습니다. enter image description here필터 텍스트 상자의 wpf DataGrid 값

+0

하는 열 이름 또는 이메일로? MVVM 디자인 패턴을 사용하고 있습니까? – Colin

+0

@Colin, MVVM에서이 작업 수행 방법 – Mussammil

답변

22

당신은 당신이 Filter 조건을 적용 할 수 DataGridItemSource에 대한 ICollectionView를 사용하고 필요한 경우 목록을 refesh 수 있습니다.

다음은 매우 간단한 예입니다.

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> 

코드 :

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; } 
    } 
} 

결과 :

enter image description hereenter image description here

+0

mvvm – Mussammil

+0

에서이 작업을 수행 할 수 있습니까? http://msdn.microsoft.com/de-de/library/ff407126(v=vs.110).aspx도 참조하십시오. – peter70