2011-11-17 389 views
4

我正在执行数据网格选择更改事件内部的检查。 如果我的条件满足,代码应该被执行,选定的项目应该被高亮显示(或获得焦点),如果条件不满足,控件应该返回并且之前选择的项目应该保持被选中。WPF DataGrid SelectionChanged事件取消单元格焦点问题

这里发生的情况是,如果不满足条件,选定的项目不会改变(它按照需要工作),但焦点仍然转移到现在选择的单元格,所以单元格选择的项目是前一个单元格,而焦点是发射事件的单元格。

我试过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; 
    } 
} 
+0

你基于这种情况的条件是什么?你如何取消选择?有可能你可以通过在DataGridRow或DataGridCell上设置“IsReadOnly”的DataTrigger来代替 – Rachel

+0

该标志在其他函数中获取它的值以及该标志是否设置,我们希望datagrid单元改变,我限制了细胞的变化,但不能限制焦点,在任何情况下都会转移到点击的新细胞。取消注册selectchanged事件不起作用 –

+0

在选择更改的事件中使用的DataGrid.Dispatcher.BeginInvoke()前面的单元格根据需要突出显示,但单击的单元格可编辑 –

回答

2

防止循环。

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

注册或取消注册OnSelectionChanged()不做任何事情。 即使您注销了datagridSelectionchanged事件,它也无疑将不会控制OnSelectionChanged(Object sender,SelectionChangedEventArgs e) ,但它仍然会将焦点更改为单击的单元格,问题是如何限制更改重点 –

+1

@HemantBhatt:你提到“我试图设置datagrid.selectedindex = e.removeditem [0],这导致控制再次进入选择改变的事件,从而通过进入连续循环”。这似乎意味着这种方法的问题是_continuous loop_。取消注册,选择,注册似乎会绕过_continuous loop_问题。 –

+0

这里是我的代码 私人无效dataGrid_SelectionChanged(对象发件人,SelectionChangedEventArgs E) { 如果(!IsDirty) { 如果(e.AddedItems.Count> 0){ SelectedProfile = e.AddedItems [0]作为轮廓; } if(e.RemovedItems。Count> 0) { } } else { MessageBox.Show(“Save the profile selected”,MessageBoxButton.OK,MessageBoxImage.Warning); return; } } –

0

解决了我的问题。

需要做的是启用脏标志textbox_PreviewKeyDown()事件 ,然后在datagrid_PreviewMouseLeftButtonDown()事件执行脏检查。

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