В WPF, как я могу ограничить выбор в DataGrid только ячейками в одной строке или столбце? - PullRequest
3 голосов
/ 20 мая 2011

У нас есть DataGrid, который позволяет пользователю выбирать несколько ячеек. Тем не менее, у нас есть уникальное требование бизнеса. В частности ...

  1. Первая ячейка: вы можете выбрать в любом месте
  2. Вторая ячейка: должна быть либо в той же строке, либо в том же столбце, что и первая ячейка.
  3. Дополнительные ячейки: должны находиться в той же строке или столбце, что и вторая ячейка.

Я не вижу никаких методов PreviewSelectionChanges, которые можно использовать, и при этом я не вижу способа блокировать выборки Shift, которые бы пересекали границы допустимого выделения.

Моя текущая мысль состоит в том, чтобы сохранить свойства int? Row; и int? Col;, которые я использую для сокращения выбранных ячеек после того, как получаю событие изменения выбора, но мне кажется, что это не совсем ясно, так как это происходит после факт. Я хочу что-то, что говорит, что Cell (c, r) собирается быть выбранным. Вы позволите это? и я могу идти оттуда.

Итак ... Мысли?

Ответы [ 2 ]

0 голосов
/ 28 марта 2015

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

Например:

void DataGrid_SelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e) {
   DataGrid dg = (DataGrid)sender;

   var first_cell = dg.SelectedCells.FirstOrDefault();
   if (first_cell != null) {
      var ok_col = first_cell.Column;
      var to_remove = dg.SelectedCells.Where(c => c.Column != ok_col).ToList();
      foreach (var c in to_remove) dg.SelectedCells.Remove(c);
   }
}
0 голосов
/ 21 мая 2011

Единственный способ получить информацию немного раньше, это подключиться к событию MouseDown.Это было бы не красиво, потому что местоположение MouseDown не обязательно указывает, где будет MouseUp, но в целом это правда.Поэтому, если вы определите, что MouseDown находится в «запрещенной» ячейке, вы можете предупредить пользователя или выполнить любые другие задачи, которые вы хотите сделать.

Вы также можете поставить проверку в событии MouseClick(Я считаю, что это один), чтобы сначала проверить, является ли выбранная ячейка "запрещенной" ячейкой.Если это так, вы можете отменить событие, которое должно остановить выбор ячейки.В зависимости от того, как работает DataGrid (я пока не смог его протестировать), вам может потребоваться сделать это для пары событий Mouse.

...