Tôi nhận thấy đây là một câu hỏi cũ, bu nghĩ rằng tôi sẽ thêm câu trả lời của mình.
Thực ra, @yossharel, bạn KHÔNG biết mục nào người dùng đang cố chọn, từ MouseEventArgs. Bạn cần phải xem e.OriginalSource (có thể là một TextBlock), đó là những gì người dùng nhấp vào. Như vậy, nó có một DataContext.
Vì vậy, hãy đặt SelectedItem của TreeView bằng e.OriginalSource.DataContext.
Trong VB, bạn có thể rõ ràng hoặc ngầm: myTreeView.SelectedItem = CType (e.OriginalSource, TextBlock) .DataContext() myTreeView.SelectedItem = e.OriginalSource.DataContext()
Trong C#, bạn sẽ cần xác định loại e.OriginalSource. Làm điều này bằng cách đặt trong một điểm break, và xem những gì Studio nói với bạn rằng nó được. Trong ví dụ này: myTreeView.SelectedItem = ((TextBlock) e.OriginalSource) .DataContext()
Đây là một ví dụ từ mã của riêng tôi. Trong trường hợp của tôi, đó là một DataGrid thay vì một TreeView, nhưng nên làm việc giống nhau. Tôi sử dụng mã này để nhắc người dùng nếu có các thay đổi chưa được lưu trên mục đã chọn. Nếu người dùng trả lời "Có" cho "Tiếp tục mà không lưu?" mã tiếp tục với lựa chọn mới. Nếu không, tôi để cho Message Box chặn RoutedEvent, ngăn không cho sự kiện SelectionChanged bị kích hoạt.
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
Nguồn
2012-01-30 16:48:22
Nhưng tôi không biết mục nào người dùng đang cố chọn. Tôi chỉ có MouseEventArgs. Bất kỳ ý tưởng làm thế nào để có được mặt hàng này hoặc tôi nên đăng ký SelectedItemChanged? – yossharel
Sử dụng kỹ thuật này để lấy DataContext: http://stackoverflow.com/questions/1092639/in-wpf-how-do-i-get-the-data-object-associated-to-the-tree-view-item -underneath và sau đó sử dụng SelectedItems.Add() –
MouseEventArgs.Source cho bạn biết đối tượng đã được nhấp vào. Tôi đã làm một cái gì đó tương tự với TabItems (hiển thị một hộp thoại khi người dùng chọn một tab khác), và sửa chữa là để thiết lập myTabControl.SelectedItem = e.Source. – TarkaDaal