5

ユーザーが何らかのロジックに基づいてPreviewMouseDown他のアイテムを選択できるかどうかを判断するために、TreeView でイベントを行いました。現在のアイテム データが変更された場合、変更を破棄するかどうかをユーザーに尋ねるメッセージ ボックスが表示されます。ユーザーが YES を押すとe.Handled = false;、新しい選択が有効になるように設定します。ユーザーがNOを押すとe.Handled = true;、新しい選択をキャンセルするように設定しました。

問題は、設定したのにe.Handled = falseTreeView でイベントが停止し、選択イベントが発生しないことです。誰かがそれに対する解決策を持っていますか?

前もって感謝します!

4

2 に答える 2

3

メッセージ ボックスへのフォーカスの変更は、マウス ダウン イベントをキャンセルするため、処理されるかどうかは問題ではありません。メッセージ ボックスを表示する前にユーザーが選択しようとしていた項目がわかっているので、ユーザーが [はい] を押した場合は、プログラムでその項目を選択するだけです。

于 2010-12-29T18:27:19.730 に答える
1

これは古い質問だと思いますが、回答を追加すると思いました。

実際、@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
于 2012-01-30T16:48:22.927 に答える