1

編集可能である必要がある値のデータグリッドを使用してMVVMWPFアプリを作成しています。値の意味は他のデータによって異なるため、値の種類によって異なるテンプレートを使用して編集するためのユーザーコントロールを作成しました。つまり、テキストボックス、コンボボックス、またはデータベースにリンクして可能な値を取得する他のいくつかの社内コントロールの1つとして表示される場合があります。これは私が使用したxamlです。

<DataGridTemplateColumn Header="Value">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <local:ValueViewingControl Value="{Binding Value}" ValueType="{Binding SettingValueType}" />
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
    <DataGridTemplateColumn.CellEditingTemplate>
        <DataTemplate>
            <local:ValueEditingControl Value="{Binding Value,Mode=TwoWay}" ValueType="{Binding SettingValueType}" />
        </DataTemplate>
    </DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>

問題は、編集モードになったら、ValueEditingControlのいずれかの部分を次にクリックすると、セルが編集モードを終了し、実際に何かを実行する前にValueViewingControlに戻ることです。私はそれがその失われた焦点を考えている細胞と関係があると思います。実際にタブをクリックするかセルからクリックするまで、セルを編集モードに保つ方法を知っている人はいますか?

[編集]もう少しテストすると、編集コントロールとしてテキストボックスまたは標準のコンボボックスを使用すると、期待どおりに機能することがわかります。これにより、ポップアップを組み込んだ、私が作成したカスタムコントロールの実装だと思います。編集コントロールの一部であるポップアップを選択すると、データグリッドセルを終了したと見なされ、編集モードが終了します。フォーカスの目的でポップアップが内部にあることをデータグリッドセルに納得させるにはどうすればよいですか?可能である必要があります。そうでない場合、コンボボックスは機能しません。

4

2 に答える 2

1

この質問のおかげで、データグリッドでのWPF Popupの焦点により、私は自分の問題に対する部分的な解決策を見つけました。
問題は、ポップアップが浮かんでいるデータグリッドセルが、ポップアップの内側をクリックしたときにフォーカスを奪おうとしていることのようです。
私の解決策は、このハンドラーとヘルパー関数をポップアップを含むユーザーコントロールに追加することです

Private Sub ControlRoot_PreviewLostKeyboardFocus(sender As System.Object, e As System.Windows.Input.KeyboardFocusChangedEventArgs)
    Dim popupelement As Popup = FindVisualChild(Of Popup)(ControlRoot)
    If (popupelement IsNot Nothing AndAlso popupelement.IsOpen) Then
        e.Handled = True
    End If
End Sub

Function FindVisualChild(Of T As DependencyObject)(ByVal element As DependencyObject) As T
    If element Is Nothing Then
        Return Nothing
    ElseIf TypeOf (element) Is T Then
        Return element
    Else
        Dim count = VisualTreeHelper.GetChildrenCount(element)
        For index As Integer = 0 To count - 1
            Dim child As DependencyObject = VisualTreeHelper.GetChild(element, index)
            If TypeOf (child) Is T Then
                Return child
            Else
                Dim grandchild As T = FindVisualChild(Of T)(child)
                If grandchild IsNot Nothing Then Return grandchild
            End If
        Next
    End If
    Return Nothing
End Function

これにより、ポップアップが開いている場合にフォーカスが離れることがなくなります。それは完璧ではないので、誰かがより良い解決策を持っているなら、私はすべての耳ですが、それは機能します。

于 2012-05-10T14:14:04.267 に答える
0

この方法で編集モードに入るにはどうすればよいですか。

<DataGrid.CellStyle>
    <Style TargetType="{x:Type DataGridCell}">
        <Style.Triggers>
            <Trigger Property="IsSelected" Value="True">
                <Setter Property="IsEditing" Value="True" />
            </Trigger>
        </Style.Triggers>
    </Style>
</DataGrid.CellStyle>

が選択されなくなると、編集モードは終了しますDataGridCell

于 2012-05-03T14:08:40.377 に答える