在WPF中,如何将DataGrid中的选择限制为仅在同一行或列中的单元格?

时间:2011-05-20 18:51:18

标签: wpf datagrid selection multi-select

我们有一个DataGrid,允许用户多选单元格。但是,我们有一个独特的业务需求。具体地说...

  1. 第一个单元格:您可以随时随地选择
  2. 第二个单元格:必须与第一个单元格在同一行或同一列中。
  3. 其他单元格:必须与第二个单元格定义的行或列相同。
  4. 我没有看到任何要使用的PreviewSelectionChanges方法,也没有看到任何方法来阻止跨越允许选择范围的Shift-Selections。

    我目前的想法是维护一个int? Row;int? Col;属性,用于在我获得选择更改事件后修剪所选单元格,但在我看来并不是那么清楚它发生在事后。我想要一些说'Cell(c,r)即将被选中的东西。你会允许吗?'我可以从那里去。

    所以...想法?

2 个答案:

答案 0 :(得分:0)

我能想到的更早获取信息的唯一方法是利用MouseDown事件。它不会很漂亮,因为MouseDown位置不一定表示MouseUp的位置,但通常是正确的。因此,如果您确定MouseDown处于“禁止”单元格中,您可以提醒用户或执行您想要执行的任何其他任务。

您还可以检查MouseClick事件(我相信这是一个),首先检查被选中的单元格是否为“禁止”单元格。如果是,您可以取消应该停止选择单元格的事件。根据{{​​1}}的工作原理(我还没有测试过),您可能需要为几个鼠标事件执行此操作。

答案 1 :(得分:0)

通过响应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);
   }
}