2011-11-17 4 views
4

DataGrid 선택 변경 이벤트에서 체크를 수행하고 있습니다. 내 조건이 만족되면 코드가 실행되어야하고 선택한 항목이 강조 표시되어야합니다 (또는 포커스를 얻음). 조건이 만족스럽지 않으면 컨트롤이 반환되고 이전에 선택된 항목이 선택된 상태로 유지되어야합니다 ( ).WPF DataGrid SelectionChanged 이벤트 취소 셀 포커스 문제

조건이 충족되지 않으면 선택한 항목이 변경되지 않고 (원하는대로 작동 함) 포커스가 여전히 현재 선택된 셀로 이동하므로 선택된 셀이 이전 셀인 반면, 초점은 사건을 해고 한 세포입니다.

나는 datagrid.dispatcher.invoke 접근 방식을 시도했지만 작동하지 않는 것 같습니다. 또한 DataGrid.selectedindex = e.removeditem [0]을 설정하여 컨트롤을 선택 변경 이벤트로 다시 유도하므로 연속 루프가됩니다.

무엇을 제안하십시오.

EDIT :

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 셀을 변경, 난 세포의 변화를 제한했지만 어떤 경우에는 클릭 한 새로운 세포로 이동합니다 초점을 제한 할 수 없습니다. 선택 변경 이벤트 등록 취소 중 하나가 작동하지 않습니다 –

+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 보낸 사람, SelectionChangedEventArgs e) 에 컨트롤을 가져 오지는 않지만 의심 할 바는 클릭 한 셀의 포커스를 계속 변경합니다. 문제는 변경을 제한하는 방법입니다. 포커스 –

+1

@HemantBhatt : "나는 데이터 그 리드를 선택하려고 시도했습니다. 선택 인덱스 = e.removeditem [0] 따라서 컨트롤을 선택 변경 이벤트로 전환하여 연속 루프에 넣습니다." 이것은이 접근법의 문제점이 _ 연속적인 _이라는 것을 의미합니다. 등록 취소, 선택, 등록은 _ 연속 루프 _ 문제를 우회하는 것처럼 보입니다. –

+0

여기 내 코드 개인 무효 dataGrid_SelectionChanged (객체 송신자 SelectionChangedEventArgs E)이다 { 경우 (! IsDirty 사용) { (e.AddedItems.Count> 0) { SelectedProfile e.AddedItems = [0] 프로필과 같은 경우 ; } if (e.RemovedItems.개수> 0) { } } else { MessageBox.Show ("선택한 프로필 저장", MessageBoxButton.OK, MessageBoxImage.Warning); 반환; } } –

0

해결되었습니다.

수행해야 할 작업은 더티 플래그를 textbox_PreviewKeyDown() 이벤트 에 설정 한 다음 datagrid_PreviewMouseLeftButtonDown() 이벤트에서 더티 체크를 수행하는 것입니다.

오염이 발견되면 제어가이 흐름의 코드 실행을 건너 뛰도록 e.handled=true으로 설정하십시오.