WPF 3.5 フレームワークのデータグリッド内のすべてのチェックボックスを選択/選択解除するには、C# コードが必要です。グリッド内の単一のヘッダー チェックボックスをクリックしてこれを行いたいと思います。
助けてください。
これは宣言的に行うことができます。以下は、行ごとにチェックボックス列を作成し、行の選択を切り替えることができます。チェックボックス列のヘッダーをクリックして、すべての行を選択できます。
xaml の関連部分
<Window x:Class="Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:toolkit="http://schemas.microsoft.com/wpf/2008/toolkit">
<toolkit:DataGrid Name="dataGrid"
ItemsSource="{Binding}" AutoGenerateColumns="True"
SelectionMode="Extended" CanResizeRows="False">
<toolkit:DataGrid.RowHeaderTemplate>
<DataTemplate>
<Grid>
<CheckBox IsChecked="{
Binding Path=IsSelected,
Mode=TwoWay,
RelativeSource={RelativeSource FindAncestor,
AncestorType={x:Type toolkit:DataGridRow}}}"
/>
</Grid>
</DataTemplate>
</toolkit:DataGrid.RowHeaderTemplate>
</toolkit:DataGrid>
</Window>
.Net4.0XAMLファイルで使用するサンプルデータグリッドは次のとおりです。
<DataGrid Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2" Name="dgMissingNames" ItemsSource="{Binding Path=TheMissingChildren}" Style="{StaticResource NameListGrid}" SelectionChanged="DataGrid_SelectionChanged">
<DataGrid.Columns>
<DataGridTemplateColumn CellStyle="{StaticResource NameListCol}">
<DataGridTemplateColumn.HeaderTemplate>
<DataTemplate>
<CheckBox Checked="CheckBox_Checked" Unchecked="CheckBox_Unchecked" />
</DataTemplate>
</DataGridTemplateColumn.HeaderTemplate>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding Path=Checked, UpdateSourceTrigger=PropertyChanged}" Name="theCheckbox"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Binding="{Binding Path=SKU}" Header="Album" CellStyle="{StaticResource NameListCol}"/>
<DataGridTextColumn Binding="{Binding Path=Name}" Header="Name" CellStyle="{StaticResource NameListCol}"/>
<DataGridTextColumn Binding="{Binding Path=Pronunciation}" Header="Pronunciation" CellStyle="{StaticResource NameListCol}"/>
</DataGrid.Columns>
</DataGrid>
コードビハインドは次のとおりです。
private void HeadCheck(object sender, RoutedEventArgs e, bool IsChecked)
{
foreach (CheckedMusicFile mf in TheMissingChildren)
{
mf.Checked = IsChecked;
}
dgMissingNames.Items.Refresh();
}
private void CheckBox_Checked(object sender, RoutedEventArgs e)
{
HeadCheck(sender, e, true);
}
private void CheckBox_Unchecked(object sender, RoutedEventArgs e)
{
HeadCheck(sender, e, false);
}
TheMissingChildrenは、いくつかの文字列プロパティとチェックされたブール値を持つ単純なオブジェクト構造です。
HTH。
これは、思い出すことができない他の誰かの情報源に基づいていますが、タイプの視覚的な子を見つけるのに役立ちます。このシナリオでは最も効率的な使用法ではないかもしれませんが、正しい軌道に乗るのに役立つかもしれません。
public static childItem FindVisualChild<childItem>(DependencyObject obj) where childItem : DependencyObject
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(obj, i);
if (child != null && child is childItem)
return (childItem)child;
childItem childOfChild = FindVisualChild<childItem>(child);
if (childOfChild != null)
return childOfChild;
}
return null;
}
[Edit 4.16.09] それを踏まえて、この方法を試してみてください。すべての CheckBoxes を見つけて、指定された状態に変更し、Checked/Unchecked イベントでイベント ハンドラーから呼び出し可能にする必要があります。
public static void CheckAllBoxes(DependencyObject obj, bool isChecked)
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
{
// If a checkbox, change IsChecked and continue.
if (obj is CheckBox)
{
((CheckBox) obj).IsChecked = isChecked;
continue;
}
DependencyObject child = VisualTreeHelper.GetChild(obj, i);
CheckAllBoxes(child, isChecked);
}
}
WPF の新しいデータバインディング機能を使用します。マスター チェックボックスの IsChecked プロパティをバインディング ソースとして、すべてのチェックボックスに IsChecked プロパティの一方向バインディングを与えます。
別のオプションは、トリガーを使用することです
DataColumn dt = null;
for (int i = 0; i < dataGrid.Columns.Count; i++)
{
dt = new DataColumn("Column Name");
dt.DataType = typeof(Boolean);
dt.DefaultValue = false;
dataTable.Add(dt);
}
dataGied.DataContext = dataTable;
<Custom:DataGrid x:Name="dataGrid" AutoGenerateColumns="True" ItemsSource="{Binding}" />
まあ、それは大まかなアイデアです。これが機能することを願っています