我在WPF C#中的datagrid中有一个复选框all列。
<DataGridCheckBoxColumn Binding="{Binding IsSelected,UpdateSourceTrigger=PropertyChanged}" CanUserSort="False">
<DataGridCheckBoxColumn.ElementStyle>
<Style TargetType="CheckBox" BasedOn="{StaticResource {x:Type CheckBox}}">
<Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="HorizontalAlignment" Value="Center"/>
</Style>
</DataGridCheckBoxColumn.ElementStyle>
<DataGridCheckBoxColumn.HeaderTemplate>
<DataTemplate x:Name="dtAllChkBx">
<CheckBox Name="cbxAll" HorizontalAlignment="Center" Margin="0,0,5,0" IsEnabled="{Binding Path=DataContext.IsCbxAllEnabled,RelativeSource={RelativeSource AncestorType=DataGrid}}"
IsChecked="{Binding Path=DataContext.AllSelected,RelativeSource={RelativeSource AncestorType=DataGrid},UpdateSourceTrigger=PropertyChanged}"/>
</DataTemplate>
</DataGridCheckBoxColumn.HeaderTemplate>
</DataGridCheckBoxColumn>
当我选中All复选框时,它当然会标记所有复选框,但是当我取消选中一个复选框后,仍然会选中All复选框。这应该是未选中的。我应该如何使用WPF C#。
答案 0 :(得分:1)
如果我理解正确 - 在收集项目中更改 IsSelected 属性后,您应该更新 AllSelected 值。
因此,您需要在所有项目(事件或操作或您想要的任何机制)中进行一些回调,并更改 AllSelected 的获取逻辑
以下是项目 IsSelected 属性和构造函数的一些草稿:
public bool IsSelected {
get { return isSelected; }
set {
isSelected = value;
OnPropertyChanged();
if (globalUpdate != null) globalUpdate();
}
}
public ItemClass(Action globalUpdate, ...your parameters) {
this.globalUpdate = globalUpdate;
...do smth with your parameters
}
使用示例:
new ItemClass(() => OnPropertyChanged("AllSelected"))
当然不要忘记 AllSelected getter
public bool AllSelected {
get { return YourGridItemsCollection.All(item => item.IsSelected); }
现在,当您手动检查所有项目时,将自动检查 AllSelected ,并在取消选中任何项目时取消选中。