在选择数据网格WPF的复选框标题时,如何编写代码来选择/取消选中所有复选框?

时间:2015-01-29 13:01:52

标签: c# wpf visual-studio-2010 checkbox

我在WPF中使用数据网格时遇到的问题很少。以前我对Windows表单很满意。

我在数据网格中添加了一个复选框列,并在标题中添加了一个复选框。

现在如何在选择复选框标题时编写代码来选择/取消选中所有复选框?

我尝试了其他帖子的所有可能答案,但我无法成功。我在某处感到困惑。

<DataGrid AutoGenerateColumns="True" Height="204" HorizontalAlignment="Left" Margin="38,162,0,48" Name="dataGrid1" VerticalAlignment="Stretch" Width="729" AreRowDetailsFrozen="False"  EnableColumnVirtualization="False" IsManipulationEnabled="False" CanUserAddRows="False" AutoGeneratingColumn="dataGrid1_AutoGeneratingColumn" RowHeight="26" ColumnHeaderHeight="26" FontSize="15">
    <DataGrid.Columns>
        <DataGridCheckBoxColumn >
            <DataGridCheckBoxColumn.Header>
                <CheckBox Name="SelectAll" ></CheckBox>
            </DataGridCheckBoxColumn.Header>
        </DataGridCheckBoxColumn>
    </DataGrid.Columns>
</DataGrid>

接下来我该怎么做?

2 个答案:

答案 0 :(得分:2)

在WPF中,您应该使用数据绑定。因此,在您的情况下,您应该将bool属性数据绑定到CheckBox中的Header,将另一个属性绑定到集合中的每个项目:

<DataGridCheckBoxColumn Binding="{Binding IsSelected, Mode=TwoWay}">
    <DataGridCheckBoxColumn.Header>
        <CheckBox Name="SelectAll" IsChecked="{Binding AreAllCheckBoxesChecked, 
            RelativeSource={RelativeSource AncestorType={x:Type YourPrefix:YourWindow}}}" />
</DataGridCheckBoxColumn>

在此示例中,集合中的项目需要具有IsSelected属性才能将数据绑定到DataGridCheckBoxColumn,并且您的视图模型或后面的代码需要AreAllCheckBoxesChecked属性数据绑定到Header Checkbox.IsChecked属性。然后,更新IsSelected属性的setter中每个集合项的AreAllCheckBoxesChecked属性是一件简单的事情:

public bool AreAllCheckBoxesChecked
{
    get { return areAllCheckBoxesChecked; }
    set 
    {
        areAllCheckBoxesChecked = value;
        foreach (YourDataType item in YourCollection)
        {
            item.IsSelected = value;
        }
        NotifyPropertyChanged("AreAllCheckBoxesChecked"); 
    }
}

答案 1 :(得分:0)

如果您正在关注MVVM,则需要将复选框绑定到VM的某些属性,否则,您可以为已检查和未检查的事件设置事件处理程序,而不是IsSelected。

<DataGridTemplateColumn>
                            <DataGridTemplateColumn.HeaderTemplate>
                                <DataTemplate>
                                    <CheckBox IsChecked="{Binding SelectAll}"/>
                                </DataTemplate>
                            </DataGridTemplateColumn.HeaderTemplate>
                            <DataGridTemplateColumn.CellTemplate>
                                <DataTemplate>
                                    <CheckBox IsChecked="{Binding IsSelected}"/>
                                </DataTemplate>
                            </DataGridTemplateColumn.CellTemplate>
                        </DataGridTemplateColumn>