简体   繁体   English

WPF Datagrid-我可以以编程方式选择组中的所有行吗?

[英]WPF Datagrid - Can I programmatically select all rows in a Group?

Regards, 问候,

I have a DataGrid with a checkbox column to allow the user to select rows, a "select all" checkbox in the column header, and a "select all" checkbox in the group header. 我有一个带复选框列的DataGrid,允许用户选择行,列标题中有一个“全选”复选框,组标题中有一个“全选”复选框。

XAML: XAML:

 <DataGrid x:Name="TablaDatos"
            AutoGenerateColumns="False" 
            CanUserAddRows="False"
            CanUserReorderColumns="True" 
            CanUserResizeColumns="True" 
            CanUserResizeRows="True" 
            CanUserSortColumns="True"
            SelectionMode="Extended"
            Grid.Row="2">
        <DataGrid.GroupStyle>
            <GroupStyle>
                <GroupStyle.ContainerStyle>
                    <Style TargetType="{x:Type GroupItem}">
                        <Setter Property="Margin" Value="0,0,0,5"/>
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate TargetType="{x:Type GroupItem}">
                                    <Expander IsExpanded="True">
                                        <Expander.Background>
                                            <LinearGradientBrush>
                                                <GradientStop Color="#A0FAFAFF" Offset="0.3" />
                                                <GradientStop Color="#FFAACAFF" Offset="1" />
                                            </LinearGradientBrush>
                                        </Expander.Background>
                                        <Expander.Header>
                                            <DockPanel>
                                                <CheckBox x:Name="ProyectoCHK" Margin="0 5 0 0" Click="ProyectoCHK_Click"></CheckBox>
                                                <Label FontWeight="Bold" Content="{Binding Path=Name}" Width="200" Target="{Binding ElementName=ProyectoCHK}"/>
                                                <TextBlock FontWeight="Bold" Text="{Binding Path=ItemCount}" Margin="0 5 0 0"/>
                                            </DockPanel>
                                        </Expander.Header>
                                        <Expander.Content>
                                            <ItemsPresenter />
                                        </Expander.Content>
                                    </Expander>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </GroupStyle.ContainerStyle>
            </GroupStyle>
        </DataGrid.GroupStyle>
        <DataGrid.Columns>
            <DataGridTemplateColumn>
                <DataGridTemplateColumn.HeaderTemplate>
                    <DataTemplate>
                        <CheckBox/>
                    </DataTemplate>
                </DataGridTemplateColumn.HeaderTemplate>
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <CheckBox IsChecked="{Binding Path=Checked, UpdateSourceTrigger=PropertyChanged}" Name="theCheckbox"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
            <DataGridTextColumn IsReadOnly="True" Header="Id. Prueba" Binding="{Binding id_prueba}" SortDirection="Descending"></DataGridTextColumn>
            <DataGridTextColumn IsReadOnly="True" Header="VSAT" Binding="{Binding VSAT}"></DataGridTextColumn>
            <DataGridTextColumn IsReadOnly="True" Header="PC" Binding="{Binding PC}"></DataGridTextColumn>
            <DataGridTextColumn IsReadOnly="True" Header="Fecha Evento" Binding="{Binding FechaUltimoEvento, StringFormat={}\{0:dd/MM/yyyy HH:mm:ss\}}"></DataGridTextColumn>
            <DataGridTextColumn IsReadOnly="True" Header="Estado" Binding="{Binding Estado}"></DataGridTextColumn>
            <DataGridTextColumn IsReadOnly="True" Header="Mensaje" Binding="{Binding Mensaje}"></DataGridTextColumn>
            <DataGridTextColumn IsReadOnly="True" Header="Fecha de creación" Binding="{Binding FechaCreacionPrueba}"></DataGridTextColumn>
            <DataGridTextColumn IsReadOnly="True" Header="Proyecto" Binding="{Binding PROYECTO}"></DataGridTextColumn>
            <DataGridTextColumn IsReadOnly="True" Header="Departamento" Binding="{Binding DEPARTAMENTO}"></DataGridTextColumn>
            <DataGridTextColumn IsReadOnly="True" Header="Municipio" Binding="{Binding MUNICIPIO}"></DataGridTextColumn>
            <DataGridTextColumn IsReadOnly="True" Header="Localidad" Binding="{Binding LOCALIDAD}"></DataGridTextColumn>
            <DataGridTextColumn IsReadOnly="True" Header="Id. punto" Binding="{Binding IDENTIFICADOR_PUNTO}"></DataGridTextColumn>
            <DataGridTextColumn IsReadOnly="True" Header="Usuario" Binding="{Binding UsuarioPrueba}"></DataGridTextColumn>
        </DataGrid.Columns>
    </DataGrid>

¿How I Can Select all Checkboxes for the rows in a group? ¿如何选择组中所有行的所有复选框?

Thanks. 谢谢。

如果您使用的是MVVM模式,则可以将视图模型中的绑定CheckBox属性设置为“ True”,并且CheckBox控件将反映该值

In the CheckBox "ProyectoCHK"'s Checked event do this... (code below may need improvements) 在CheckBox“ ProyectoCHK”的Checked事件中执行此操作(以下代码可能需要改进)

  1. The visual sibling of ProyectoCHK is a Label which is bound to the Name property in GroupStyle . ProyectoCHK的视觉同级是Label,它绑定到GroupStyle的Name属性。 Access that and copy its Content into a variable say "GroupValue". 访问该目录并将其Content复制到变量“ GroupValue”中。

  2. Assuming that you have bound your DataGrid to a CollectionView , when grouping happens you have the GroupDescription in it. 假设您已将DataGrid绑定到CollectionView ,则在进行分组时,您将拥有GroupDescription

So accessing that will give you the GroupedPropertyName on which grouping has happened. 因此,访问它将为您提供发生分组的GroupedPropertyName Then you can use 那你可以用

     var items = DataGrid.ItemsSource.AsQueryable.Where(GroupedPropertyName + " == " + "\"" + GroupValue + "\""); 

AsQueryable() is available in Linq namespace. Linq名称空间中提供了AsQueryable()

  1. The items returned by the query filter above, just make individual item.Checked = true (Assuming that item class has implemented INotifyPropertyChanged and has raised PropertyChanged notification for Checked property). 上面的查询过滤器返回的items仅构成单个item.Checked = true (假设该项目类已实现INotifyPropertyChanged并引发了Checked属性的PropertyChanged通知)。

Let me know if this works. 让我知道这个是否奏效。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM