filter wpf datagrid values from a textbox

前端 未结 1 1636
北海茫月
北海茫月 2020-12-05 21:18

I have a textbox and a Datagrid. The datagrid has two columns name and Email address. I want to Filter the datagrid values with the value in the textbox.

相关标签:
1条回答
  • 2020-12-05 22:13

    You can use a ICollectionView for the DataGrid ItemSource then you can apply a Filter predicate and refesh the list when needed.

    Here is a very quick example.

    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 = "1@test.com" };
                    yield return new TestClass { Name = "2", Email = "2@test.com" };
                    yield return new TestClass { Name = "3", Email = "3@test.com" };
                    yield return new TestClass { Name = "4", Email = "4@test.com" };
                    yield return new TestClass { Name = "5", Email = "5@test.com" };
                    yield return new TestClass { Name = "6", Email = "6@test.com" };
                    yield return new TestClass { Name = "7", Email = "7@test.com" };
                }
            }
    
            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; }
        }
    }
    

    Result:

    enter image description here enter image description here

    0 讨论(0)
提交回复
热议问题