我们有一个DataGrid,允许用户多选单元格。但是,我们有一个独特的业务需求。具体地说...
我没有看到任何要使用的PreviewSelectionChanges方法,也没有看到任何方法来阻止跨越允许选择范围的Shift-Selections。
我目前的想法是维护一个int? Row;
和int? Col;
属性,用于在我获得选择更改事件后修剪所选单元格,但在我看来并不是那么清楚它发生在事后。我想要一些说'Cell(c,r)即将被选中的东西。你会允许吗?'我可以从那里去。
所以...想法?
答案 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);
}
}