5

私は現在、親と子の関係を示す別のデータグリッドを含むrowdetailstemplateを備えたデータグリッドを持っています。2番目のグリッドには、クリックすると別のダイアログを表示するボタンを含む列があります。

行の詳細が初めて表示されるとき、ユーザーは子グリッドを1回クリックしてフォーカスを取得/アクティブにし、もう一度クリックしてボタンクリックイベントを発生させる必要があります。これは、行が最初に表示されたときにのみ発生します。

これは、最初のクリックがグリッドに飲み込まれたようなものです。RowDetailsVisibilityChangedイベントをキャプチャしてボタンのフォーカスを試みましたが、それでも問題が解決していないようです。

何か案は?

4

2 に答える 2

6

私は自分のコメントに答えます、そしてそれはおそらく他の人にも役立つでしょう。次のMSDNエントリは、問題を説明および解決します。http: //social.msdn.microsoft.com/Forums/vstudio/en-US/2cde5655-4b8d-4a12-8365-bb0e4a93546f/activating-input-controls-inside-datagrids- rowdetailstemplate-with-single-click?forum = wpf

問題は、常に表示される行の詳細では、最初にフォーカスを取得する必要があることです。この問題を回避するには、データグリッドプレビューハンドラーが必要です。

<DataGrid.RowStyle>
    <Style TargetType="{x:Type DataGridRow}"  BasedOn="{StaticResource {x:Type DataGridRow}}">
        <EventSetter Event="PreviewMouseLeftButtonDown" Handler="SelectRowDetails"/>
    </Style>
</DataGrid.RowStyle>

注:現在使用されているものを継承するためにカスタムDataGridRowスタイルを破壊したため、拡張しました。

ハンドラー自体は

private void SelectRowDetails(object sender, MouseButtonEventArgs e)
{
    var row = sender as DataGridRow;
    if (row == null)
    {
        return;
    }
    row.Focusable = true;
    row.Focus();

    var focusDirection = FocusNavigationDirection.Next;
    var request = new TraversalRequest(focusDirection);
    var elementWithFocus = Keyboard.FocusedElement as UIElement;
    if (elementWithFocus != null)
    {
        elementWithFocus.MoveFocus(request);
    }
}

行の詳細のコンテンツにフォーカスを設定し、クリック2回の問題を解決します。

注:これはすべてMSDNスレッドから取得したものであり、私自身の解決策ではありません。

于 2014-02-04T18:14:50.660 に答える
1

私は良い解決策を見つけました:D

この問題を解決するコードは1行ありますが、問題を説明するために10行あります。解決策は次のとおりです。

    protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e)
    {
        base.OnPropertyChanged(e);

        // to stop RowDetails from eating the first click.
        if (e.Property.Name == "SelectedItem" && CurrentItem == null) CurrentItem = SelectedItem;
    }

そしてここで詳細を見つけてください。

于 2014-04-28T07:50:57.503 に答える