2010-12-29 31 views
5

Tôi đã PreviewMouseDown sự kiện trên TreeView để xác định xem người dùng có thể chọn mục khác dựa trên một số logic hay không. Nếu dữ liệu mục hiện tại đã thay đổi, sẽ xuất hiện MessageBox yêu cầu người dùng nếu họ muốn hủy thay đổi. nếu người dùng nhấn YES, tôi đặt e.Handled = false; để bật lựa chọn mới. và nếu người dùng nhấn NO, tôi đặt e.Handled = true; để hủy lựa chọn mới.Sự kiện định tuyến dừng Wpf khi MessageBox xuất hiện?

Vấn đề là mặc dù tôi đặt e.Handled = false, sự kiện dừng và không có sự kiện lựa chọn nào xảy ra trên TreeView. Ai đó có giải pháp cho điều đó?

Cảm ơn trước!

Trả lời

3

Thay đổi tiêu điểm vào hộp thư sẽ hủy sự kiện chuột xuống, cho dù nó có được xử lý hay không. Vì bạn biết mục nào người dùng đang cố gắng chọn trước khi bạn hiển thị hộp thư, chỉ cần chọn mục đó theo chương trình nếu người dùng nhấn YES.

+0

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

+1

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() –

+0

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

1

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 
Các vấn đề liên quan