나는 이것이 내 질문에 대한 답을 알고 있다고 생각한다.
사실, @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
그러나 사용자가 어떤 항목을 선택하려했는지 알 수 없습니다. MouseEventArgs 만 있습니다. 이 항목을 얻는 방법에 대한 아이디어 나 SelectedItemChanged에 등록해야합니까? – yossharel
이 기술을 사용하여 DataContext를 가져옵니다. http://stackoverflow.com/questions/1092639/in-wpf-how-do-i-get-the-data-object-associated-to-the-tree-view-item -underneath 및 SelectedItems.Add()를 사용하십시오. –
MouseEventArgs.Source는 클릭 한 개체를 알려줍니다. TabItems (사용자가 다른 탭을 선택하면 대화 상자 표시)와 비슷한 작업을 수행하고 myTabControl.SelectedItem = e.Source를 설정하는 것이 수정되었습니다. – TarkaDaal