从文本框筛选WPF数据网格的值

8

我有一个文本框和一个数据表格。表格有两列,分别是名字和电子邮件地址。我想通过文本框中的值来筛选数据表格中的值。enter image description here


你是按照哪一列,姓名还是电子邮件?这里你使用MVVM设计模式吗? - Colin
@Colin,如何在MVVM中实现这个? - Mussammil
1个回答

29
你可以使用 ICollectionView 来为 DataGridItemSource 提供数据,然后可以应用一个 Filter 谓词,并在需要刷新列表时进行刷新。
这里是一个非常快速的示例。
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 = "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; }
    }
}

结果:

在此输入图片描述 在此输入图片描述


我们可以在 MVVM 中做到这一点吗? - Mussammil
虽然这并不重要,但你可以简化最后一个方法为: PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); - dfresh22

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接