如何在datagrid中嵌入数据网格中的单击复选框

时间:2017-01-12 01:49:39

标签: c# wpf checkbox datagrid

我几乎用这个搜索了自己。我看到了很多我的问题的解决方案,但它们都没有工作......我只能假设它是因为我在数据网格中嵌入了复选框。现在我的应用程序需要两次点击才能更改复选框的检查状态。我假设第一次点击是关注适当的行?或单元格,第二次单击激活检查状态更改。

这是我的XAML:

<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>

我尝试过设置样式:

 <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>

不幸的是,我不再为任何相关事件留下代码。

我也试过在这里使用某人的自定义datagrid类引用: https://stackoverflow.com/a/4827377/5807358

这个自定义课让我最接近。实际上它工作得很好......直到我需要取消选中该复选框(位于内部数据网格中)。如果没有首先切换到主数据网格的另一行然后返回,则无法更改已检查框的检查状态。我试图进一步定制这个课程,以获得我想要的东西但是变得简短。

我还应该注意到,我已经尝试了上面发布的stackoverflow链接上的每个解决方案。

有没有人遇到过这个?如果有人认为它是相关的,我可以发布我的代码隐藏。

由于

1 个答案:

答案 0 :(得分:2)

我在这里找到了答案! : http://blog.ditran.net/wpf-datagrid-rowdetailstemplate-double-click-focus-fix/

如果帖子被删除,我会发布代码:                                                                                    

<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);
            }
        }
    }

上面的样式需要在outter中添加。当我将它添加到UserControl.Resources部分时,它什么也没做。 我应该注意,我必须为DataGridRow添加一个额外的样式。使用上面的代码,当选择一行时,行标题消失。这很可能是由于我的结果。我正在使用mahapps.metro来设计我的窗户样式。我打赌那可能是罪魁祸首。