【问题标题】:WPF Datagrid - Can I programmatically select all rows in a Group?WPF Datagrid - 我可以以编程方式选择组中的所有行吗?
【发布时间】:2014-12-10 04:11:28
【问题描述】:

问候,

我有一个带有复选框列的 DataGrid,允许用户选择行,列标题中有一个“全选”复选框,组标题中有一个“全选”复选框。

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>

¿如何选择组中行的所有复选框?

谢谢。

【问题讨论】:

    标签: c# wpf datagrid grouping


    【解决方案1】:

    在 CheckBox "ProyectoCHK" 的 Checked 事件中执行此操作...(下面的代码可能需要改进)

    1. ProyectoCHK 的视觉兄弟是绑定到 GroupStyle 中的 Name 属性的 Label。访问它并将其内容复制到一个变量中,比如“GroupValue”。

    2. 假设您已将DataGrid 绑定到CollectionView,当分组发生时,您将在其中包含GroupDescription。

    因此,访问它会给你GroupedPropertyName,它发生了分组。然后你可以使用

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

    AsQueryable() 在 Linq 命名空间中可用。

    1. 上面的查询过滤器返回的items,只需要单独的item.Checked = true(假设项目类已经实现了INotifyPropertyChanged并且已经为PropertyChanged属性提出了PropertyChanged通知)。

    让我知道这是否有效。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2012-10-23
        • 2011-04-22
        • 1970-01-01
        • 2013-08-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-07
        • 1970-01-01
        相关资源
        最近更新 更多