CheckBoxFieldの列ヘッダーに全チェック/アンチェック用のチェックボックスを表示する方法をご紹介します。
まず、XamDataGridのヘッダー要素であるLabelPresenterのデフォルトのスタイルを上書きし、内部のテンプレートにCheckBoxを配置します。
(LabelPresenterのデフォルトスタイルは以下のファイルにて内容をご確認ください。
https://github.com/Infragistics/wpf-resources/blob/main/DefaultStyles/DataPresenter/DataPresenterAero_Express.xaml)
以下のようにLabelPresenterの内部のテンプレートにCheckBoxを配置し、CheckedおよびUncheckedイベントをフックアップします。
<Style x:Key="CheckBoxLabelPresenter" TargetType="{x:Type igDP:LabelPresenter}" BasedOn="{x:Static igThemes:DataPresenterGeneric.LabelPresenter}">
...
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type igDP:LabelPresenter}">
.....
<!--LabelPresenterのテンプレート内にチェックボックスを配置する-->
<CheckBox x:Name="checkAll" Width="18" Height="18" Grid.Column="2" Grid.Row="1" Checked="CheckBox_Checked" Unchecked="CheckBox_Unchecked" />
.....
</Style>
CheckedおよびUncheckedイベントでは以下のようにXamDataGridのRecordsコレクションをループし、フィルターインのレコードを対象としてデータのboolean値(データクラス名: TestData、プロパティ名: Test1)を書き換えます。
private void CheckBox_Checked(object sender, RoutedEventArgs e)
{
foreach (DataRecord rc in xamDataGrid1.Records)
{
if (!(rc.IsFilteredOut != null && (bool)rc.IsFilteredOut))
{
(rc.DataItem as TestData).Test1 = true;
}
}
}
private void CheckBox_Unchecked(object sender, RoutedEventArgs e)
{
if ((sender as CheckBox).IsFocused)
{
foreach (DataRecord rc in xamDataGrid1.Records)
{
if (!(rc.IsFilteredOut != null && (bool)rc.IsFilteredOut))
{
(rc.DataItem as TestData).Test1 = false;
}
}
}
}
LabelPresenterに指定しておいたKeyをターゲットのCheckBoxFieldのFieldSettings.LabelPresenterStyleに設定します。また、DataItemUpdateTriggerを”OnCellValueChange”に設定しておきます。
<igWPF:XamDataGrid>
<igWPF:XamDataGrid.FieldLayouts>
<igWPF:FieldLayout>
<igWPF:FieldLayout.Fields>
<igWPF:CheckBoxField Name="Test1" >
<igWPF:Field.Settings >
<igWPF:FieldSettings DataItemUpdateTrigger="OnCellValueChange" LabelPresenterStyle="{StaticResource CheckBoxLabelPresenter}" />
</igWPF:Field.Settings>
</igWPF:CheckBoxField>
.....
</igWPF:XamDataGrid>
最後に、XamDataGridのCellChangedイベントを実装し、セルのチェックボックスがアンチェックされた際にヘッダーのチェックボックスをアンチェックします。
private void xamDataGrid1_CellChanged(object sender, Infragistics.Windows.DataPresenter.Events.CellChangedEventArgs e)
{
if (e.Cell.Field.Name == "Test1" && (bool)e.Cell.Value)
{
CheckBox cb = Utilities.GetDescendantFromName(xamDataGrid1, "checkAll") as CheckBox;
cb.IsChecked = false;
}
}
ヘッダーに全チェック/アンチェックのチェックボックスが表示されました。
