ビューモデルにバインドするビューがあると思います。私のコードでは、このビューモデルには、gridview ItemsSource にバインドする要素のコレクションと、列ヘッダーの状態を表すプロパティ HeaderChecked があります。すべての要素にはプロパティ IsChecked があります。確かに ViewModel は INotifyPropertyChanged をサポートしています。
これはViewModelのコードです (DataEventsSource は INotifyPropertyChanged を実装するだけです):
public class MainViewModel : DataEventsSource
{
private ObservableCollection<Element> _elements = new ObservableCollection<Element>
{
new Element {IsChecked = false},
new Element {IsChecked = false},
new Element {IsChecked = false},
new Element {IsChecked = false}
};
public MainViewModel()
{
foreach (var element in _elements)
{
element.PropertyChanged += OnElementPropertyChanged;
}
}
private void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == "IsChecked")
{
bool? headerChecked = null;
if (Elements.All(el => el.IsChecked))
{
headerChecked = true;
}
if (Elements.All(el => !el.IsChecked))
{
headerChecked = false;
}
HeaderChecked = headerChecked;
}
}
public ObservableCollection<Element> Elements
{
get
{
return _elements;
}
set
{
_elements = value;
}
}
private bool? _headerChecked = false;
public bool? HeaderChecked
{
get
{
return _headerChecked;
}
set
{
_headerChecked = value;
OnPropertyChanged("HeaderChecked");
}
}
}
public class Element : DataEventsSource
{
private bool _isChecked;
public bool IsChecked
{
get
{
return _isChecked;
}
set
{
_isChecked = value;
OnPropertyChanged("IsChecked");
}
}
}
コレクションの要素が変更されると、ご覧のとおり、OnElementPropertyChanged メソッドで HeaderChecked プロパティが更新されます。
そして、これはビューです:
コードビハインド:
public partial class MainWindow
{
private readonly MainViewModel _viewModel = new MainViewModel();
public MainWindow()
{
InitializeComponent();
DataContext = _viewModel;
}
private void CheckBox_Checked(object sender, RoutedEventArgs e)
{
foreach (var element in _viewModel.Elements)
{
element.IsChecked = true;
}
}
private void CheckBox_UnChecked(object sender, RoutedEventArgs e)
{
foreach (var element in _viewModel.Elements)
{
element.IsChecked = false;
}
}
}
次はXAMLのメイン グリッドです(わかりやすくするために 1 つの列のみが含まれています)。
<Grid x:Name="LayoutRoot">
<DataGrid x:Name="dataGrid" CanUserAddRows="False" AutoGenerateColumns="False" ItemsSource="{Binding Elements}">
<DataGrid.Columns>
<DataGridCheckBoxColumn x:Name="checkboxColumn" Binding="{Binding IsChecked, Mode=TwoWay}" IsThreeState="True" Width="50" >
<DataGridCheckBoxColumn.HeaderTemplate>
<DataTemplate x:Name="dtAllChkBx">
<CheckBox Name="cbxAll" Content="Label" IsChecked="{Binding Path=DataContext.HeaderChecked, ElementName=LayoutRoot, Mode=TwoWay}" Checked="CheckBox_Checked" Unchecked="CheckBox_UnChecked"></CheckBox>
</DataTemplate>
</DataGridCheckBoxColumn.HeaderTemplate>
</DataGridCheckBoxColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
このコードがお役に立てば幸いです。誤解していた場合はお知らせください。