我建议您有一个绑定到视图模型的视图。在我的代码中,此视图模型具有绑定到 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");
}
}
}
如您所见,当集合元素发生更改时,HeaderChecked 属性在 OnElementPropertyChanged 方法中更新。
这是观点:
代码隐藏:
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的主网格(为简单起见,它只包含一列):
<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>
我希望这段代码对你有帮助,如果我误解了你,请告诉我。