Событие Control работает несколько раз после обновления DataContext - PullRequest
0 голосов
/ 15 апреля 2019

У меня есть столбец 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 раза, но мне нужно только один раз. Как я могу решить это?

1 Ответ

1 голос
/ 15 апреля 2019

В обновлении класса ViewData для свойства IsVisible

 private bool _IsVisible;
   public bool IsVisible
     {
       get { return _IsVisible; }
       set { _IsVisible = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("IsVisible")); }
     } 

Удалить повторное назначение видов из SearchText,

 public string SearchText
    {
        get => searchText;
        set
        {
            searchText = value;

             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"));
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...