WPF DataGrid (MultiSelector?) Вызывает событие SelectedItems CollectionChanged несколько раз - PullRequest
4 голосов
/ 08 апреля 2011

Я не уверен, если это проблема с элементом управления DataGrid или MultiSelectors в целом, но когда я выбираю несколько строк в сетке, событие CollectionChanged вызывается для каждой отдельной строки. Это имеет смысл, если я «перетаскиваю» мышью, но это также происходит, если я нажимаю «shift», чтобы выбрать несколько строк, или просто нажимаю верхнюю левую кнопку «выбрать все строки».

Я видел на MultiSelector, что есть методы Begin / EndUpdateSelectedItems, а также свойство IsUpdatingSelectedItems. К сожалению, мой потребитель этой коллекции / события не знает об ее источнике.

Есть ли способ, чтобы коллекция DataGrid / SelectedItems отправляла уведомление CollectionChanged только после завершения обновления?

спасибо, любезно.

Edit: Я обнаружил, что для DataGrid свойство IsUpdatingSelectedItems не устанавливается даже при изменении большого выделения.

Edit: Я обнаружил, что событие DataGrid SelectionChanged правильно запускается только один раз после полного изменения. К сожалению, это исключает возможность простой привязки данных, но это потенциальный обходной путь, если вы контролируете потребителя коллекции SelectedItems.

Ответы [ 2 ]

1 голос
/ 11 апреля 2011

Ради полноты я «отвечу» на свой вопрос. Оказывается, что элементы управления WPF вообще не могут обрабатывать ничего, кроме одного изменения элемента в их обработчиках событий CollectionChanged - это означает, что рабочий процесс 'вызова CollectionChanged для каждого элемента' является правильным способом для инфраструктуры в его текущая форма. Однако лично я чувствую, что это ужасная проблема с производительностью.

0 голосов
/ 16 мая 2017

ViewModel:

private MultiSelector _selectedItems;

  Public  MultiSelector SelectedItems
    {
        get {return _selectedItems;
        set { _selectedItems=value;}                             
      } 

Свяжите свойство SelectedItems с SelectedItem элемента DataGrid и добавьте System.Windows.Controls.Primitives.MultiSelector

...