【问题标题】:How do I write code to select/unselect all checkbox on selecting checkbox header of data grid WPF?如何编写代码以在选择数据网格 WPF 的复选框标题时选择/取消选择所有复选框?
【发布时间】:2015-03-28 17:19:42
【问题描述】:

我在使用 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>

接下来我该怎么做?

【问题讨论】:

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


【解决方案1】:

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

<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 属性来数据绑定到@987654329 @ 财产。然后,在AreAllCheckBoxesChecked 属性的setter 中更新每个集合项的IsSelected 属性就很简单了:

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

【讨论】:

  • 我应该为“YourDataType”和“YourCollection”提供什么?公共布尔 AreAllCheckBoxesChecked { 获取 { 返回 AreAllCheckBoxesChecked; } 设置 { AreAllCheckBoxesChecked = 值; foreach(dataGrid1.Items 中的 DataGridRow 项){ item.IsSelected = value; } } } 这不起作用。我应该更正什么?
  • 我认为这很容易解释...YourDataType 是您的每个项目的类类型,YourCollection 是您将数据绑定到的集合属性的名称DataGrid.ItemsSource 财产。至于您应该更正什么...只需再次查看我的代码并将其与您的代码进行比较...应该还有一个私有的bool areAllCheckBoxesChecked 变量。
  • 我没有为数据网格绑定任何 ItemsSource。我在代码中绑定它。 dataGrid1.ItemsSource=dataTable.AsDataView();
  • 我在代码中绑定它...不,你不是...这不是Binding。您需要将ItemsSource 属性正确数据绑定到一个集合属性才能使其工作(无论如何您都应该这样做)。你仍然可以setup a Binding in code
【解决方案2】:

如果您关注 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>

【讨论】:

  • 你能告诉我一些用于检查和未检查事件的事件处理程序的代码吗?这就是我被打动的地方。
  • 相信我不要走那条路,尝试使用 MVVM 来实现阅读。
猜你喜欢
  • 2011-03-12
  • 1970-01-01
  • 2011-10-09
  • 1970-01-01
  • 1970-01-01
  • 2014-06-20
  • 1970-01-01
  • 2012-01-02
  • 1970-01-01
相关资源
最近更新 更多