WPF DataGrid SelectionChanged事件取消单元格聚焦问题

4
我正在数据网格选择更改事件中执行检查。 如果满足条件,代码应该得到执行,并且所选项应该被突出显示(或获得焦点);如果不满足条件,则控件应返回, 以前选择的项应保持选定状态。
问题在于,如果条件不满足,则所选项不会更改(这是期望的工作方式),但焦点仍会转移到当前选择的单元格,因此,当前焦点所在位置的单元格是之前的单元格而不是触发该事件的单元格。
我已尝试过datagrid.dispatcher.invoke方法,但似乎没有起作用。 还尝试了设置datagrid.selectedindex = e.removeditem [0],这样会再次将控件置于选择更改事件中,从而进入连续循环。
请提供建议。
编辑:
dataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
   if (!IsDirty) 
   { 
       if (e.AddedItems.Count > 0) 
       { 
          SelectedProfile = e.AddedItems[0] as profile; 
       } 
       if (e.RemovedItems.Count > 0) 
       { 
       } 
   }
   else 
   {
      MessageBox.Show("Save the profile selected", MessageBoxButton.OK, MessageBoxImage.Warning); 
      return; 
   } 
}

你基于什么条件进行选择,如何取消选择?可能您可以使用DataTriggerDataGridRowDataGridCell上设置IsReadOnly - Rachel
标志位的值在其他函数中设置,无论标志位是否被设置,我们都希望数据网格单元格发生变化。我已经限制了单元格的变化,但无法限制焦点,因为无论如何焦点都会转移到新点击的单元格上。注销选择更改事件也无效。 - Hemant Bhatt
在选择更改事件中使用了DataGrid.Dispatcher.BeginInvoke(),以便前一个单元格按预期方式突出显示,但所单击的单元格变为可编辑。 - Hemant Bhatt
2个回答

2

避免循环。

void OnSelectionChanged(Object sender, SelectionChangedEventArgs e)
{
    // condition code
    if (conditionFailed)
    {
        datagrid.SelectionChanged -= OnSelectionChanged;
        datagrid.Selectedindex = e.Removeditem[0];
        datagrid.SelectionChanged += OnSelectionChanged;
    }
}

注册或注销OnSelectionChanged()不起作用。 即使您注销了datagridSelectionchanged事件,它无疑也不会将控件传递到OnSelectionChanged(Object sender, SelectionChangedEventArgs e), 但它仍然会更改单击的单元格上的焦点,问题是如何限制焦点的更改。 - Hemant Bhatt
1
@HemantBhatt:你提到了“我已经尝试设置datagrid.selectedindex=e.removeditem[0],这会再次将控件带入选择更改事件,从而形成连续循环”。这似乎意味着这种方法的问题是_连续循环_。注销、选择、注册似乎可以避免_连续循环_问题。 - Jake Berger
这是我的代码: private void dataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (!IsDirty) { if (e.AddedItems.Count > 0) { SelectedProfile = e.AddedItems[0] as profile; } if (e.RemovedItems.Count > 0) { } } else { MessageBox.Show("请保存所选配置文件", MessageBoxButton.OK, MessageBoxImage.Warning); return; } } - Hemant Bhatt
如果用户更改了所选配置文件中的某些内容,并且isDirty标志设置为true,我希望消息框显示“保存所选配置文件”,这正是它正在做的,数据网格焦点应保留在先前选择的配置文件上,而不是导致此事件触发的单元格。 - Hemant Bhatt
在选择更改事件中使用了DataGrid.Dispatcher.BeginInvoke(),以便前一个单元格按预期方式突出显示,但所单击的单元格变为可编辑。 - Hemant Bhatt
@HemantBhatt DataGrid.Dispatcher.BeginInvoke() 会启动一个异步操作,所以单元格可能在点击事件中被选中,而您在 BeginInvoke() 调用中所做的任何操作只是在选择已更改后更改突出显示的项目。 - Rachel

0

问题已解决。

需要在textbox_PreviewKeyDown()事件中启用dirty标志,然后在datagrid_PreviewMouseLeftButtonDown()事件中执行dirty检查。

如果发现dirty,则设置e.handled=true,以便控件跳过此流程的代码执行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接