2010-12-29 2 views
5

사용자가 일부 로직을 기반으로 다른 항목을 선택할 수 있는지 확인하기 위해 TreeView에서 PreviewMouseDown 이벤트를 받았습니다. 현재 항목 데이터가 변경된 경우 변경 사항을 취소할지 묻는 MessageBox가 나타납니다. 사용자가 YES를 누르면 새로운 선택을 활성화하기 위해 e.Handled = false;을 설정합니다. 사용자가 NO를 누르면 e.Handled = true;을 설정하여 새 선택을 취소합니다.Wpf가 MessageBox가 나타날 때 라우팅 이벤트를 중지 하시겠습니까?

문제는 내가 e.Handled = false을 설정했지만 이벤트 중지 및 선택 이벤트가 TreeView에서 발생한다는 것입니다. 누군가 그것을위한 해결책이 있습니까?

미리 감사드립니다.

답변

3

메시지 상자로 포커스를 변경하면 마우스 down 이벤트가 취소되므로 처리 여부와 상관 없습니다. 사용자가 메시지 상자를 표시하기 전에 어떤 항목을 선택하려고했는지 알았으므로 사용자가 YES를 누르면 프로그래밍 방식으로 해당 항목을 선택하기 만하면됩니다.

+0

그러나 사용자가 어떤 항목을 선택하려했는지 알 수 없습니다. MouseEventArgs 만 있습니다. 이 항목을 얻는 방법에 대한 아이디어 나 SelectedItemChanged에 등록해야합니까? – yossharel

+1

이 기술을 사용하여 DataContext를 가져옵니다. http://stackoverflow.com/questions/1092639/in-wpf-how-do-i-get-the-data-object-associated-to-the-tree-view-item -underneath 및 SelectedItems.Add()를 사용하십시오. –

+0

MouseEventArgs.Source는 클릭 한 개체를 알려줍니다. TabItems (사용자가 다른 탭을 선택하면 대화 상자 표시)와 비슷한 작업을 수행하고 myTabControl.SelectedItem = e.Source를 설정하는 것이 수정되었습니다. – TarkaDaal

1

나는 이것이 내 질문에 대한 답을 알고 있다고 생각한다.

사실, @yossharel은 MouseEventArgs에서 사용자가 어떤 항목을 선택하려했는지 알 수 있습니다. 사용자가 클릭 한 e.OriginalSource (아마도 TextBlock)를 살펴볼 필요가 있습니다. 따라서 DataContext가 있습니다.

그래서 TreeView의 SelectedItem을 e.OriginalSource.DataContext와 같게 설정하십시오. VB에서

, 당신은 명시 적 또는 암시가 될 수 있습니다 myTreeView.SelectedItem =에서는 CType (e.OriginalSource, TextBlock이) .DataContext() myTreeView.SelectedItem = e.OriginalSource.DataContext()

C#에서

, e.OriginalSource의 유형을 판별해야합니다. 중단 점을 넣고 Studio가 그 사실을 알리는 지 확인하십시오. 이 예제에서 : myTreeView.SelectedItem = ((TextBlock) e.OriginalSource) .DataContext()

다음은 내 코드의 예제입니다. 내 경우, 그것은 TreeView 대신 DataGrid이지만 동일한 작업을 수행해야합니다. 선택한 항목에 저장되지 않은 변경 사항이있는 경우이 코드를 사용하여 사용자에게 메시지를 표시합니다. 사용자가 "저장하지 않고 계속 하시겠습니까?"에 "예"라고 대답하면 코드는 새로운 선택으로 계속됩니다. 그렇지 않으면 MessageBox가 RoutedEvent를 차단하여 SelectionChanged 이벤트가 실행되지 않도록합니다.

Private Sub dgDataGrid_PreviewMouseLeftButtonDown(sender As Object, e As System.Windows.Input.MouseButtonEventArgs) Handles dgDataGrid.PreviewMouseLeftButtonDown 
    If dgDataGrid.SelectedItem IsNot Nothing Then 
     If MyDataContext.ExternalViewModel.ItemIsModified Then 
      Dim prompt As String = String.Format("Changes have not been saved.{0}{0}Continue without saving?", vbCrLf) 
      Dim title As String = "Changes Not Saved" 
      Dim result As MsgBoxResult = MsgBox(prompt, MsgBoxStyle.Exclamation Or MsgBoxStyle.YesNo, title) 
      If result = MsgBoxResult.Yes Then 
       dgDataGrid.SelectedItem = e.OriginalSource.DataContext() 
      End If 
     End If 
    End If 
End Sub 

Private Sub dgDataGrid_SelectionChanged(sender As System.Object, e As System.Windows.Controls.SelectionChangedEventArgs) Handles dgDataGrid.SelectionChanged 
    MyDataContext.SetSearchItem(dgDataGrid.SelectedItem) 
End Sub