2017-01-12 9 views
2

私はこのサイトでほとんど自分自身を探知しています。私は、私の問題に対する多くの解決策を見ていますが、それらのどれも働いていません...私は、それが中央にあるチェックボックスを使ってデータグリッドを入れ子にしているためです。今、私のアプリはチェックボックスのチェック状態を変更するために2回のクリックが必要です。私は最初のクリックが適切な行に焦点を当てることだと思いますか? 2回目のクリックでチェック状態の変更が有効になります。データグリッドの中にネストされたDataGridのチェックボックスをシングルクリックする方法

<UserControl.Resources> 
    <vm:StringToVisibilityConverter x:Key="StringToVisibilityConverter"/> 
    <BooleanToVisibilityConverter x:Key="BoolToVisibility"/> 
    <!--<Style TargetType="custom:DataGridWithNavigation" BasedOn="{StaticResource {x:Type DataGrid}}"/>--> 
    <!--<Style TargetType="{x:Type DataGridCell}"> 
     <EventSetter Event="PreviewMouseLeftButtonDown" Handler="DataGridCell_PreviewMouseLeftButtonDown" /> 
     <EventSetter Event="PreviewTextInput" Handler="DataGridCell_PreviewTextInput" /> 
    </Style>--> 
    <!--<Style x:Key="dataGridStyle" TargetType="{x:Type DataGridCell}"> 
     <EventSetter Event="PreviewMouseLeftButtonDown" Handler="DataGridCell_PreviewMouseLeftButtonDown"></EventSetter> 
    </Style>--> 
    <!--<Style TargetType="{x:Type DataGridRow}"> 
     <EventSetter Event="MouseEnter" Handler="DataGridCell_PreviewMouseLeftButtonDown"></EventSetter> 
    </Style>--> 
    <!--<Style TargetType="DataGridRow"> 
     <Style.Triggers> 
      <Trigger Property="IsMouseOver" Value="True"> 
       <Setter Property="IsSelected" Value="True" /> 
      </Trigger> 
     </Style.Triggers> 
    </Style>--> 
    <!--<Style TargetType="DataGridCell"> 
     <Style.Triggers> 
      <MultiTrigger> 
       <MultiTrigger.Conditions> 
        <Condition Property="IsReadOnly" Value="False" /> 
        <Condition Property="IsMouseOver" Value="True" /> 
       </MultiTrigger.Conditions> 
       <Setter Property="IsEditing" Value="True" /> 
      </MultiTrigger> 
     </Style.Triggers> 
    </Style>--> 
</UserControl.Resources> 

は、私はもはや、残念ながら表示するために、それらの関連するイベントのいずれかの背後にあるコードを持っていない:

<Grid> 
    <DockPanel ScrollViewer.CanContentScroll="True" ScrollViewer.VerticalScrollBarVisibility="Auto" VirtualizingPanel.IsContainerVirtualizable="True" > 
     <TextBox x:Name="textBoxSearch" DockPanel.Dock="Top" Margin="10" TextChanged="TxtFilter_TextChanged" Height="25" MinWidth="250" HorizontalAlignment="Stretch"/> 
     <DataGrid x:Name="objDatagrid" ItemsSource="{Binding DataView}" CanUserAddRows="False" CanUserDeleteRows="False" AutoGenerateColumns="False" 
       HeadersVisibility="None" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" RowDetailsVisibilityMode="Visible" 
        VirtualizingPanel.VirtualizationMode="Recycling"> 
      <DataGrid.GroupStyle> 
       <!-- Style for groups at top level. --> 
       <GroupStyle> 
        <GroupStyle.ContainerStyle> 
         <Style TargetType="{x:Type GroupItem}"> 
          <Setter Property="Template"> 
           <Setter.Value> 
            <ControlTemplate TargetType="{x:Type GroupItem}"> 
             <Expander Margin="15 0 15 0" IsExpanded="True" HorizontalAlignment="Stretch"> 
              <Expander.Header> 
               <!-- Control for the expander header text --> 
               <custom:HighlightTextBlock Text="{Binding Path=Name}" 
                      HighlightPhrase="{Binding ElementName=textBoxSearch, Path=Text}" 
                      HighlightBrush="Lime"/> 
              </Expander.Header> 
              <ItemsPresenter HorizontalAlignment="Stretch" /> 
             </Expander> 
            </ControlTemplate> 
           </Setter.Value> 
          </Setter> 
         </Style> 
        </GroupStyle.ContainerStyle> 
       </GroupStyle> 
      </DataGrid.GroupStyle> 
      <DataGrid.Columns> 
       <DataGridTemplateColumn> 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <!-- Question Container Textblock. --> 
          <custom:HighlightTextBlock Text="{Binding QuestionText}" FontWeight="Bold" 
                 HighlightPhrase="{Binding ElementName=textBoxSearch, Path=Text}" 
                 HighlightBrush="Lime"/> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate> 
       </DataGridTemplateColumn> 
      </DataGrid.Columns> 
      <DataGrid.RowDetailsTemplate> 
       <DataTemplate> 
        <DataGrid x:Name="objInnerDatagrid" ItemsSource="{Binding Answers}" CanUserAddRows="False" CanUserDeleteRows="False" 
           HeadersVisibility="None" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" 
           AutoGenerateColumns="False"> 

         <DataGrid.Columns> 
          <DataGridTemplateColumn> 
           <DataGridTemplateColumn.CellTemplate> 
            <DataTemplate> 
             <DockPanel> 
              <CheckBox DockPanel.Dock="Top" Checked="CheckBox_Checked" Unchecked="CheckBox_Checked" IsChecked="{Binding Path=IsSelected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"> 
               <CheckBox.Content> 
                <!-- Answer Checkbox Content : Textblock. --> 
                <custom:HighlightTextBlock Text="{Binding AnswerText}" 
                      HighlightPhrase="{Binding ElementName=textBoxSearch, Path=Text}" HighlightBrush="Lime"/> 
               </CheckBox.Content> 
              </CheckBox> 
              <custom:TestUC Margin="20,10,0,0" HorizontalAlignment="Stretch" Visibility="Collapsed" x:Name="SubQuestionUserControl"/> 

             </DockPanel> 
            </DataTemplate> 
           </DataGridTemplateColumn.CellTemplate> 
          </DataGridTemplateColumn> 
         </DataGrid.Columns> 
        </DataGrid> 
       </DataTemplate> 
      </DataGrid.RowDetailsTemplate> 
     </DataGrid> 
    </DockPanel> 
</Grid> 

私はスタイルを設定しようとしている:

は、ここに私のXAMLです。私もここに誰かのカスタムDataGridクラス参照を使用して試してみました

https://stackoverflow.com/a/4827377/5807358

このカスタムクラスは私に最も近いました。実際には、内部のDataGridにあるそのチェックボックスのチェックを外す必要があるまでは素晴らしい結果でした。既にチェックされているボックスのチェック状態を変更する方法はありませんでした。最初にメインのDataGridの別のRowに切り替えてから、元に戻します。私はそのクラスをさらにカスタマイズして、私が望むものを得ることを試みたが、短くなった。

また、上記のstackoverflowリンクのすべてのソリューションを試してみました。

誰もがこれまでに遭遇したことはありますか?もし誰かが関連性があると思えば、コードビハインドを投稿することができます。

ありがとうございました

答えて

2

私の回答が見つかりました!

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

イベントハンドラ:

void SelectRowDetailSection(object sender, MouseButtonEventArgs e) 
    { 
     var row = sender as DataGridRow; 
     if (row != null) 
     { 
      row.Focusable = true; 
      row.Focus(); 
      // Creating a FocusNavigationDirection object and setting it to a 
      // local field that contains the direction selected. 
      FocusNavigationDirection focusDirection = FocusNavigationDirection.Next; 
      // MoveFocus takes a TraveralReqest as its argument. 
      TraversalRequest request = new TraversalRequest(focusDirection); 
      // Gets the element with keyboard focus. 
      UIElement elementWithFocus = Keyboard.FocusedElement as UIElement; 
      // Change keyboard focus. 
      if (elementWithFocus != null) 
      { 
       elementWithFocus.MoveFocus(request); 
      } 
     } 
    } 

上記追加されるために必要なスタイル:ポストが今まで削除される場合には http://blog.ditran.net/wpf-datagrid-rowdetailstemplate-double-click-focus-fix/

私は、コードを投稿しますアウトター内でUserControl.Resourcesセクションに追加すると、何もしませんでした。 DataGridRowにスタイルを追加する必要があることに注意してください。上記のコードで行が選択されたとき、行ヘッダーは消えました。これはおそらく私の最後の何かによって引き起こされます。私はmahapps.metroを使ってウィンドウをスタイルしています。それが犯人かもしれないと確信しています。

関連する問題