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. Filter WPF DataGrid-Werte aus einem Textfeld
5
A
Antwort
22
Sie können eine ICollectionView
für die DataGrid
ItemSource
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:
von welcher Spalte, Namen oder E-Mail? Und verwenden Sie MVVM Design Pattern hier? – Colin
@Colin, wie man das in MVVM macht – Mussammil