2011-11-17 396 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,以便控制跳過此流程的代碼執行。