未取消选中一个复选框行上的WPF复选框

时间:2015-08-10 07:48:32

标签: c# wpf checked

我在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#。

1 个答案:

答案 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 ,并在取消选中任何项目时取消选中。