これは古い質問だと思いますが、回答を追加すると思いました。
実際、@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 ですが、同じように動作するはずです。このコードを使用して、選択したアイテムに保存されていない変更がある場合にユーザーにプロンプトを表示します。ユーザーが「保存せずに続行しますか?」に「はい」と答えた場合 コードは新しい選択を続けます。それ以外の場合は、メッセージ ボックスで 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