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

| 我们有一个DataGrid,它允许用户多选单元格。但是,我们有一个独特的业务需求。特别... 第一个单元格:您可以在任何地方选择 第二个单元格:必须与第一个单元格在同一行或同一列中。 其他单元格:必须与第二个单元格所定义的行或列相同。 我看不到要使用的任何PreviewSelectionChanges方法,也看不到任何阻止Shift-Selections跨越允许选择范围的方法。 我当前的想法是保持一个
int? Row;
int? Col;
属性,当我收到选择更改事件后,该属性用于修剪选定的单元格,但是在我看来这并不是很清楚,因为它是在事实发生之后发生的。我想要说\'Cell(c,r)即将被选中的内容。您允许吗?\',我可以从那里去。 所以...有什么想法吗?     
已邀请:
我想提早获取信息的唯一方法是利用MouseDown事件。这不是很漂亮,因为
MouseDown
的位置不一定表示
MouseUp
的位置,但通常是正确的。因此,如果您确定“ 2”在“禁止的”单元格中,则可以提醒用户或执行您想执行的其他任何任务。 您还可以在
MouseClick
事件中进行检查(我相信这是一个事件),以便首先检查是否选中的单元格是“禁止”单元格。如果是这样,您可以取消该事件,该事件将阻止选择该单元格。根据ѭ6的工作方式(我还无法测试),您可能需要为几个Mouse事件执行此操作。     
通过响应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);
   }
}
    

要回复问题请先登录注册