2016-02-25 3 views
0

Я работаю с datagrid, который загрузит более тысячи элементов, чтобы я включил виртуализацию. Когда я попытался выбрать все, используя Datagrid.SelectAll() в коде позади, выбор работает отлично. Но когда я изменяю свойство IsSelected программно из скрытых элементов, элементы не обновляются при прокрутке вниз.Виртуализация Datagrid не работает должным образом, когда свойство IsSelected установлено программно

шаги с использованием SelectAll():

  1. Изначально все элементы выбираются с помощью SelectAll() в коде позади.
  2. Я выбрал 1 строку.
  3. Все остальные элементы будут отменены, кроме выбранного.

шаги с использованием программно обновляя IsSelected свойство верно:

  1. Изначально все элементы выбираются программно обновления каждого элемента свойство IsSelected = верно.
  2. Я выбрал 1 строку.
  3. Видимые элементы отменены, за исключением текущей выбранной строки. Но когда я прокручиваю вниз, скрытые элементы по-прежнему выбираются.

Как я могу изменить свойство IsSelected для скрытых объектов?

+0

Это не ошибка в описании? Does DataGrid.Select ** All() ** выбирает только определенную строку? – VDN

+0

Извините за путаницу. Я обновил свою проблему. Надеюсь, ты поможешь мне. Благодаря! – Dyva

+0

Вы пытались отменить выбор всех строк перед тем, как выбрать конкретный? Как 'dataGridView.ClearSelection()'; Насколько я знаю, с помощью 'row.IsSelected' вы можете выбрать любое количество строк. Он не будет отбирать ранее выбранные строки: 'for (int i = 0; i <10; i ++) rows [i] .isSelected = true' будет выбирать все 10 строк – VDN

ответ

0

Я решил проблему путем обработки скрытых объектов на change.This отбора осуществляется с использованием MVVM картины.

 private void HandleContentSelection(SelectionChangedEventArgs e) 
     { 
      if (e == null) return; 

      var dataGrid = e.Source as DataGrid; 
      if (dataGrid == null) return; 

      #region Update Grid Selection 

      if (e.AddedItems != null) 
      { 
       foreach (var item in e.AddedItems.Cast<IContent>()) 
       { 
        if (!item.IsSelected) 
        { 
         item.IsSelected = true; 
        } 
       } 
      } 

      if (e.RemovedItems != null) 
      { 
       _contentsToBeUnselected.Clear(); 

       // Handle Multiple selection 
       // Set hidden items IsSelected property to false 
       if (dataGrid.SelectedItems.Count > 0 && (e.AddedItems == null || e.AddedItems.Count == 0) && e.RemovedItems.Count > 1) 
       { 
        foreach (var content in dataGrid.Items.Cast<IContent>()) 
        { 
         if (!dataGrid.SelectedItems.Contains(content)) 
         { 
          _contentsToBeUnselected.Add(content); 
         } 
        } 
       } 
       // Handle Unselect All 
       // Set hidden items IsSelected property to false 
       else if (dataGrid.SelectedItems.Count == 0 && (e.AddedItems == null || e.AddedItems.Count == 0)) 
       { 
        _contentsToBeUnselected.AddRange(dataGrid.Items.Cast<IContent>()); 
       } 
       else 
       { 
        _contentsToBeUnselected.AddRange(e.RemovedItems.Cast<IContent>()); 
       } 

       foreach (var item in _contentsToBeUnselected) 
       { 
        if (item.IsSelected) 
        { 
         // if bound data item still is selected, fix this 
         item.IsSelected = false; 
        } 
       } 
      } 

      e.Handled = true; 

      #endregion 

     } 
0

попробовать это DataGrid.UnselectAllCells();