Я понимаю, что это старый вопрос, но я подумал, что добавлю свой ответ.
На самом деле, @yossharel, вы действительно знаете, какой элемент пользователь пытался выбрать из MouseEventArgs.Вам нужно взглянуть на e.OriginalSource (вероятно, TextBlock), на который пользователь нажал.Таким образом, он имеет DataContext.
Итак, установите SelectedItem TreeView равным 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 ()
Вот пример из моего собственного кода.В моем случае это DataGrid вместо TreeView, но он должен работать так же.Я использую этот код, чтобы подсказать пользователю, есть ли несохраненные изменения в выбранном элементе.Если пользователь отвечает «Да» на «Продолжить без сохранения?»код продолжается с новым выбором.В противном случае я позволяю окну сообщений блокировать 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