У меня есть столбец DataGrid с шаблоном как флажок с событиями check / uncheck для некоторых вычислений и сравнения данных, а также текстовое поле, которое позволяет мне использовать поиск по полю имени и скрывать бесполезные результаты:
DataGrid.xaml
<TextBox Name="TbSearch"
Grid.Row="0"
Background="#F5F5F5"
BorderBrush="#F5F5F5"
Padding="27,6,0,0"
Text="{Binding SearchText, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
<DataGrid Name="DgViews"
Grid.Row="1"
AutoGenerateColumns="False"
IsReadOnly="True"
ItemsSource="{Binding Views}">
<DataGrid.RowStyle>
<Style TargetType="{x:Type DataGridRow}">
<Style.Triggers>
<DataTrigger Binding="{Binding IsVisible}" Value="False">
<Setter Property="Visibility" Value="Collapsed" />
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid.RowStyle>
<DataGrid.Columns>
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox Tag="{Binding UniqueId}"
IsChecked="{Binding IsChecked, UpdateSourceTrigger=PropertyChanged}"
Checked="ViewCheck"
Unchecked="ViewUncheck"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Width="*"
Header="View name"
Binding="{Binding ViewName}"/>
<DataGridTextColumn Width="*"
Header="View type"
Binding="{Binding ViewType}"/>
</DataGrid.Columns>
DataGridTest.xaml.cs
public DataGridTest()
{
InitializeComponent();
DataContext = new ModelDataContext();
}
private void ViewCheck(object sender, RoutedEventArgs e)
{
MessageBox.Show("Checked");
}
private void ViewUncheck(object sender, RoutedEventArgs e)
{
MessageBox.Show("UnChecked");
}
ModelDataContext.cs
class ModelDataContext : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private string searchText = string.Empty;
public ModelDataContext()
{
}
public string SearchText
{
get => searchText;
set
{
searchText = value;
Views = Views.Select(n =>
{
if (n.ViewName.ToLower().Contains(searchText.ToLower()))
{
n.IsVisible = true;
}
else
{
n.IsVisible = false;
}
return n;
}).ToList();
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Views"));
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("SearchText"));
}
}
public List<ViewData> Views { get; set; }
}
Когда я набираю поисковый текст, источник элементов DataGrid обновляется каждый раз, и при каждом обновлении событие флажка (ставить / снимать флажок) увеличивается на единицу.
Например, я набираю 3 буквы и обновления сетки данных 3 раза, поэтому, когда я ставлю флажок, он работает 3 раза, но мне нужно только один раз.
Как я могу решить это?