Обработка Проверяется по-разному в зависимости от того, вызывается ли он щелчком мыши или виртуализацией. - PullRequest
2 голосов
/ 24 сентября 2010

У меня есть сетка данных инструментария WPF с включенной виртуализацией.В каждой строке есть флажок, привязанный к bool в базовой модели.

Флажки (в дополнение к привязке данных) также имеют обработчики Checked и Unchecked (!), Позволяющие проверять сразу несколько элементов, если вынажали одну с несколькими выбранными строками.

Вот xaml:

<Controls:DataGrid ItemsSource="{Binding UnderlyingData}"
                   AutoGenerateColumns="False"
                   HeadersVisibility="Column">

  <Controls:DataGrid.Columns>
    <Controls:DataGridTemplateColumn Header="Use?" SortMemberPath="Use">
      <Controls:DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
          <CheckBox Style="{StaticResource DataGridCheckBoxStyle}" IsChecked="{Binding Spike}"
                    Checked="CheckBox_Checked" Unchecked="CheckBox_Unchecked" />
        </DataTemplate>
      </Controls:DataGridTemplateColumn.CellTemplate>
    </Controls:DataGridTemplateColumn>              
  </Controls:DataGrid.Columns>
</Controls:DataGrid>

И обработчики Checked / Unchecked:

private void CheckBox_Checked(object sender, RoutedEventArgs e)
{
    if (!processingMultipleRows)
    {
        UpdateAllSelected(e.OriginalSource as ToggleButton);
        e.Handled = true;
    }
}

private void CheckBox_Unchecked(object sender, RoutedEventArgs e)
{
    if (!processingMultipleRows)
    {
        UpdateAllSelected(e.OriginalSource as ToggleButton);
        e.Handled = true;
    }
}

private void UpdateAllSelected(ToggleButton checkBox)
{
    processingMultipleRows= true;
    var include = checkBox.IsChecked ?? false;
    tickBoxSelector.ApplyToAllSelected<RowViewModel>(checkBox, p => p.Use = include);
    ViewModel.ProcessUseStateChange();
    processingMultipleRows= false;
}

Этот код работает во всех отношенияхКроме одного.ViewModel.ProcessUseStateChange () довольно медленный и в настоящее время вызывается один раз, когда вы переключаете один или несколько флажков.Это хорошо, но он также вызывается один раз для каждой новой строки, появляющейся при просмотре сетки данных, поскольку виртуализация означает, что необходимо создавать новые строки и устанавливать их состояние проверки.

Есть ли хитрый способ?определить, вызывается ли Checked в ответ на щелчок мыши или создание новой строки из-за виртуализации?

1 Ответ

2 голосов
/ 24 сентября 2010

Решение, которое я нашел в конце, состояло в том, чтобы обрабатывать событие Click, а не Checked / Unchecked, это значительно упрощало:

<Controls:DataGrid ItemsSource="{Binding UnderlyingData}"
                   AutoGenerateColumns="False"
                   HeadersVisibility="Column">

  <Controls:DataGrid.Columns>
    <Controls:DataGridTemplateColumn Header="Use?" SortMemberPath="Use">
      <Controls:DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
          <CheckBox Style="{StaticResource DataGridCheckBoxStyle}" IsChecked="{Binding Spike}"
                    Click="CheckBox_Clicked"/>
        </DataTemplate>
      </Controls:DataGridTemplateColumn.CellTemplate>
    </Controls:DataGridTemplateColumn>              
  </Controls:DataGrid.Columns>
</Controls:DataGrid>

и:

private void CheckBox_Clicked(object sender, RoutedEventArgs e)
{
    UpdateAllSelected(e.OriginalSource as ToggleButton);
    e.Handled = true;
}

private void UpdateAllSelected(ToggleButton checkBox)
{
    var include = checkBox.IsChecked ?? false;
    tickBoxSelector.ApplyToAllSelected<RowViewModel>(checkBox, p => p.Use = include);
    ViewModel.ProcessUseStateChange();
}
...